2011-07-18 10 views
29

私のアプリでは、会話には多くのメッセージがあります。会話内の新しいメッセージが作成/保存されたときに会話のupdated_at属性を更新するにはどうすればよいですか?Rails:子を保存するときに親オブジェクトを更新する

私はこれを行う:touch => trueを認識していますが、メッセージが破棄されたときの会話も更新されます。これは私が望んでいないものです。

ありがとうございました。

モデル

class Conversation < ActiveRecord::Base 
    has_many :messages 
end 

class Message < ActiveRecord::Base 
    belongs_to :conversation 
end 

答えて

36

Messageクラス内での使用コールバック

after_save do 
    conversation.update_attribute(:updated_at, Time.now) 
end 
+0

1パンチに私を打つために! – jaydel

+0

すばらしい、ありがとう。 – alste

+0

あなたは 'self.conversation ... 'に言及しなくてもなぜそれが動作するのか教えてくれますか? 「自己」を使用しない場合と使用しない場合 – HungryCoder

9

私はRailsの3のために、このソリューションを好む:

class Message < ActiveRecord::Base 
    belongs_to :conversation 

    after_save :update_conversation 

    def update_conversation 
    self.conversation.touch 
    end 
end 

出典:http://apidock.com/rails/ActiveRecord/Persistence/touch

51

ヨ関係についても同様に定義することができます。

class Message < ActiveRecord::Base 
    belongs_to :conversation, touch: true 
end 

(ウィリアムGの答えと同じ出典:http://apidock.com/rails/ActiveRecord/Persistence/touch

+8

これはコールバックを実行しません!!あなたが親コールバックを実行したいときにこれをやりたいと思う時間がほとんどです。 – Nerve

+3

元の質問から: '会話の新しいメッセージが作成/保存されたときの会話のupdated_at属性を更新する方法' '.touch'メソッドは主にタイムスタンプの更新に使用されます。 (ドキュメントから: 'updated_at/on属性を設定したレコードを現在の時刻に保存します.')' touch'の最も一般的な使用法はおそらくキャッシュの有効期限です。 コールバックが必要な場合は、after_touchコールバックがあります。 – chug2k

+0

別の使い方は、サイトマップのタイムスタンプで、その場合に必要なコールバックはありません。 – Swards

関連する問題