2011-07-12 64 views
3

我正在嘗試爲我的Rails應用程序設置Beta邀請。我有邀請模型和用戶模型。Rails遷移在另一個表中創建條目時更新現有記錄

用戶有一個invitation_id。我正在驗證該用戶必須擁有一個invitation_id,並且它應該是唯一的。我想寫一個遷移,以便我可以更新我的現有用戶以擁有一個invitation_id。

這裏是我的邀請模式:

# Table name: invitations 
# 
# id    :integer   not null, primary key 
# sender_id  :integer 
# recipient_email :string(255) 
# token   :string(255) 
# sent_at   :datetime 
# created_at  :datetime 
# updated_at  :datetime 

爲了保證唯一性,我將要創建的邀請表中的記錄,並分配相應的ID將用戶記錄。

有人可以建議一樣的遷移嗎?

在此先感謝!

回答

7

如果您已經爲您的邀請和用戶進行了遷移,那麼您應該將邀請填充到自定義佣金任務中。總是一個很好的做法,嚴格保持您的遷移表操作。

/lib/tasks/distribute_invitations.rake

namespace :db do 
    desc "Run all custom tasks" 
    task :import_all => [:distribute_invitations, :some_other_data_import] 

    desc: "Some other data import" 
    task :some_other_data_import => :environment do 
    puts "insert task code here" 
    end 

    desc: "Give existing user's invitations" 
    task :distribute_invitations => :environment do 
    for user in User.all 
     if user.invitation_id.nil? 
     invite = Invitation.create(:sender_id => <some id>, :recipient_email => <some email>, :token => <some token>, :sent_at => Time.now) 
     user.update_attribute(:invitation_id, invite.id) 
     puts "Updated user #{user.id} with invitation_id #{invite.id}" 
     else 
     puts "User already has an invitation_id" 
     end 
    end 
    end 
end 

後你做你的遷移,讓您的用戶表中的invitation_id,你可以運行:

rake db:distribute_invitations 

和您現有的用戶將有邀請函通過invitation_id創建並關聯到他們。

或運行所有的任務,你可以這樣做:

rake db:import_all 

在這種情況下,它很可能只是與你的用戶遷移堅持在遷移:

​​
+0

感謝克里斯。這是一個很好的解決方案。出於好奇,爲什麼我們不應該使用遷移來實現呢?我所有在這個應用程序上工作的同事(以及未來的合作者)也將不得不分別運行rake db:distribute_invitations以便在他們的系統中運行。 –

+0

我也建議這也是模型代碼。 –

+0

剛剛通過噩夢般的體驗得知,無論何時在遷移中存在種子數據依賴性時,我都會後悔自己的後悔。使追蹤變得更難一些,並且不能在需要時重新運行任務。我曾在一個團隊環境中工作過,每當我們有自定義任務需要運行在現有表中填充數據時,我們一直在尋找/ lib/tasks。如果你或其他人需要做同樣的事情,他們可以追加到文件中,這樣所有的數據操作都集中在 –

相關問題