更改对不同模型轨道迁移的引用

时间:2015-09-17 14:05:39

标签: ruby-on-rails migration

如何将Referral表迁移到指向现有数据库的PatientProfile id而不是User id(即想要迁移所有现有行)?

class User
  belongs_to :profile, polymorphic: true
  has_many :referrals

class PatientProfile
  has_one :user, as: :profile

class Referral
  belongs_to :user

我可以通过简单地进行迁移并将user_id列重命名为patient_profile_id并更改模型中的引用来实现此目的,但这不会迁移到现有记录上。

1 个答案:

答案 0 :(得分:0)

我不会简单地更改列名。我会做这样的事情

class AddPatientProfileToReferrals < ActiveRecord::Migration
  def up
    add_column :referrals, :patient_profile_id
    add_index :referrals, :patient_profile_id

    Referral.reset_column_information

    Referral.includes(:user).find_each do |referral|
      referral.update_attribute(:patient_profile_id, referral.user.profile_id)
    end

    remove_column :referrals, :user_id
  end
end

您可能希望确保引荐具有用户,并且您可以简单地反转该过程以编写down方法。