在Rails 3中将现有的has_many关系更改为多态

时间:2013-04-27 22:22:52

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

我的两个模型之间存在has_many关系 - 称之为“汽车”和“乘客” - 在我的生产环境中有几千个“乘客”属于几百个“卡”。我正在添加另一个模型,称之为“火车”,我想将汽车和乘客之间现有的has_many关系改为多态,将每位乘客与汽车或火车相关联。

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

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

1 个答案:

答案 0 :(得分:25)

您必须编写一些迁移,例如

  1. 向Passenger表添加两列。 - > rails g migration change_column_in_passenger

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

  3. 代码:

    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
    



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