2011-07-12 6 views
3

私のRailsアプリケーションのベータ版招待状を設定しようとしています。私はInvitationモデルとUserモデルを持っています。Railsの移行別のテーブルにエントリを作成中に既存のレコードを更新します

ユーザーは1つの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

招待状とユーザー用の移行を既に済ませている場合は、実際に招待状をカスタムレイクタスクに配置する必要があります。テーブル操作のために移行を厳密に保つことは、常に良い方法です。

rake db:distribute_invitations 

をし、既存のユーザーは招待状を持っています:

/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を与えるために、あなたの移行を実行した後、あなたが実行することができますinvitation_idを介して作成され、関連付けられます。

それともあなたがすることができるすべてのタスクを実行するには:ちょうどあなたのユーザーの移行と移行して、それを固執することは非常に可能である。この場合

rake db:import_all 

​​
+0

おかげでクリスが。これは素晴らしい解決策です。好奇心のために、なぜ私たちは移行を使ってそれをしてはなりませんか?このアプリケーションで作業している私の同僚(および将来の共同作業者)は、自分のシステムでこれを動作させるためにrake db:distribute_invitationsを別々に実行する必要があります。 –

+0

これもモデルコードであることをお勧めします。 –

+0

マイグレートの経験を通して、マイグレーションにシードデータの依存関係がある場合はいつでも、私はいつも後でそれを後悔していることを知っています。追跡するのが少し難しくなり、必要であればタスクを再実行する能力が与えられません。私はチーム環境で作業していました。既存のテーブルにデータを取り込む必要があるカスタムタスクがあるときは、常に/ lib/tasksを探しました。あなたや他の誰かが同じことをする必要があった場合、それらはファイルに追加するだけで、すべてのデータ操作が一元化されます –

関連する問題