在轨道中将多对多移动到一对一

时间:2013-12-27 21:12:27

标签: ruby-on-rails one-to-one rails-migrations has-and-belongs-to-many

我有两个模型之间的关系,目前是多对多。我想将它转变为一对一的关系,因为这就是所有数据的结果。

有没有无缝的方法来做到这一点?通过迁移和模型更改组合?我的模型很容易改变,如下所示:

现在

class App < ActiveRecord::Base
  has_and_belongs_to_many :owners
end

class Owner < ActiveRecord::Base
  has_and_belongs_to_many :apps
end

更改为

class App < ActiveRecord::Base
  belongs_to :owner
end

class Owner < ActiveRecord::Base
  has_one :app
end

但是如何更新数据库以反映这些变化而不会丢失我目前拥有的任何数据?

2 个答案:

答案 0 :(得分:1)

owner_id表中添加apps字段,然后遍历您的apps_owners表,并将owner_id中的apps字段设置为{{1} } owner_id记录apps_owners等于apps的{​​{1}}记录。

假设你是正确的并且SQL之后的同一id没有多个app_id条目应该这样做(未经测试),尽管我不熟悉如何合并原始SQL进入迁移:

apps_owners

答案 1 :(得分:0)

你将无法做到这一点。主要问题是has_and_belongs_to_many关系使用第三级数据库表(在您的情况下为apps_owners)来保存关系信息。

在创建适当的迁移以将owner_id添加到App模型后,您需要创建一个rake任务,该任务会读取app_owner表并重新创建关系。