2010-11-22 4 views
0

はこのように私は(基本的に)見える三つのモデルを持っていると言う:Railsで特定のフィールドが更新されたときに、高度なロジックを実行するにはどうすればよいですか?

class User < ActiveRecord::Base 
    has_many :projects 
    has_many :deliverables 
end 

class Project < ActiveRecord::Base 
    belongs_to :user 
    has_many :deliverables 
end 

class Deliverable < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :project 
end 

は今、私は以下のことが起こるしたいと言う:projectは別のuserから転送されたときに、すべての関連するdeliverablesが転送されますそれと一緒に。そうですね、

project = Project.find(some_criteria) 

deliverables = project.deliverables 

project.user_id = new_user_id 

deliverables.each do |d| 
    d.user_id = new_user_id 
end 

ここで説明した内容を自動化する方法はありますか?私はいつももちろん(transfer_userのような)方法にそれを入れてもいいですが、user_idが新しい値に設定されると自動的にそれが起こることを好みます。

+0

理由だけではなく、ユーザーにhas_manyを削除しない:成果を?プロジェクトからユーザーの成果物を取得することができます(例: 'user.project.deliverables')。次に転送する必要はありません。新しいプロジェクトユーザーは、すべての成果物を自動的に継承します。 –

+0

@マーク:そうです。実際には、私が実際に作業しているコードに現実的に対応していない、実践的な例でした。私は悪い例を含めることをお詫びします。私が幸いなことに、Kangの答えは、私が扱っている実際のシナリオ(モデル間の関連性は、あなたが提案した解決策を可能にするためにきれいにはうまくいかない場合)に対処しています。 –

答えて

4

あなたはおそらくまだtransfer_userメソッドを実装したいのですが、実行することにより、プロジェクトのモデルにコールバックを追加します。

class Project < ActiveRecord::Base 
    after_save :transfer_user, :if => "user_id_changed?" 
end