【问题标题】:Changing an existing has_many relation to polymorphic in Rails 3在 Rails 3 中将现有的 has_many 关系更改为多态
【发布时间】:2013-04-27 22:22:51
【问题描述】:

我已经在两个模型之间建立了一个现有的 has_many 关系——称它们为“汽车”和“乘客”——在我的生产环境中,有几千个“乘客”属于几百个“卡片”。我正在添加另一个模型,称为“火车”,并且我想将汽车和乘客之间现有的 has_many 关系更改为将每位乘客与汽车或火车相关联的多态关系。

我的迁移应该是什么样的?我想在迁移时保留数据库中的现有关系,所以我宁愿做一些表重命名,而不是删除一列以将其替换为另一列。此外,我希望能够在不打开服务器控制台并手动编辑所有记录的情况下做到这一点,因此当我将更改推送到生产环境时,我可以一举迁移整个数据库。有什么建议吗?

TL;DR:如何将现有的 has_many 关系更改为具有新模型的多态关系?

【问题讨论】:

  • 我现在必须做同样的事情,但对于请求模型。我会发布我的结果
  • 我最终采用了以下解决方案。无摩擦

标签: ruby-on-rails ruby ruby-on-rails-3 polymorphic-associations


【解决方案1】:

您将不得不编写一些迁移,例如

  1. 向乘客表添加两列。 -> rails g 迁移 change_column_in_passenger

  2. 在迁移文件中,在up方法中写入如下代码

代码:

def up
  rename_column :passengers, :car_id, :transport_id
  add_column :passengers, :transport_type, :string
  Passenger.reset_column_information
  Passenger.update_all(:transport_type => "Car")
end

def down
  rename_column :passengers, :transport_id, :car_id
  remove_column :passengers, :transport_type
end



因此,此迁移将更新 Passenger 中所有当前的 Car 关系。 还将允许训练模型与Passenger 建立关系。

【讨论】:

  • 如何也加入 add_index :passengers, [:transport_id, :transport_type] ?
  • 我接受了@akshay 的建议,这似乎奏效了。 add_index 语法有什么作用?
  • 索引有助于更好地搜索。 add_index 在特定列上应用 mysql 索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多