而 ActiveRecord 中会建立一张零丁的表,表的名称是两张表名按照字母表次序的拼接,如不雅是 Post 和 Tag,对应的多对多表就是 posts_tags,除了创建多对多表,has_and_belongs_to_many 还会创建两个 ActiveRecord::Base的子类 Tag::HABTM_Posts 和 Post::HABTM_Tags,我们可以应用下面的代码简单实验一下:
我们欲望大年夜 MongoDB 迁徙到 MySQL 的另一个重要原因就是 MongoDB 每一个文档的主键实袈溱是太过冗长,一个 32 字节的 _id 无法给我们供给特别多的信息,只能增长我们的浏览障碍,再加上项目中并没有安排 MongoDB 集群,所以没能享受到用默认的 UUID 生成机制带来的好处。
上述代码打印出了两个 has_and_belongs_to_many 生成的类 Tag::HABTM_Posts 和 Post::HABTM_Tags,它们有着完全雷同的表 posts_tags,处理多对多关系瓯,我们只须要在应用 DatabaseTransformer 导入表中的所有的数据之后,再经由过程遍历 posts_tags 表中的数据更新多对多的关系表就可以了:
- class PostsTag < ActiveRecord::Base; end
- # migrate data from mongodb to mysql.
- transformer = DatabaseTransformer.new ‘draven_production’
- transformer.import :posts_tags
- # establish association between posts and tags.
- PostsTag.unscoped.all.each do |model|
- post = Post.find_by_uuid model.post_uuid
- tag = Tag.find_by_uuid model.tag_uuid
- next unless post.present? && tag.present?
- model.update_columns post_id: post.id, tag_id: tag.id
- end

所有应用 has_and_belongs_to_many 的多对多关系都须要经由过程上述代码进行迁徙,这一步须要在删除数据库中的所有 uuid 字段之前完成。
- # app/models/post.rb
- class Post < ActiveRecord::Base
- validate_presence_of :title, :content
- end
- # db/migrate/20170908075625_create_posts.rb
- class CreatePosts < ActiveRecord::Migration[5.1]
- def change
- create_table :posts do |t|
- t.string :title, null: false
- t.text :content, null:
推荐阅读
总之,HDD硬盘和SSD硬盘各有本身的市场。而兼具SSD硬盘和HDD硬盘的机能和特点的mSATASSD设备和混淆驱动器是花费者寻求分砂茨?的更浩揭捉?择。 沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的>>>详细阅读
本文标题:如何从MongoDB迁移到MySQL?这有现成经验!
地址:http://www.17bianji.com/lsqh/38066.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示