Rails:保存子级时更新父对象

als*_*ste 35 ruby-on-rails

在我的应用程序中,Conversation有很多消息.如何updated_at在创建/保存该对话中的新消息时更新对话的属性?

我知道:touch => true,这样做,但它也会在消息被销毁时更新对话,这不是我想要的.

谢谢.

楷模

class Conversation < ActiveRecord::Base
  has_many :messages 
end

class Message < ActiveRecord::Base
  belongs_to :conversation
end
Run Code Online (Sandbox Code Playgroud)

chu*_*g2k 58

您也可以在关系上定义它.

class Message < ActiveRecord::Base
  belongs_to :conversation, touch: true
end
Run Code Online (Sandbox Code Playgroud)

(来源与William G的答案相同:http://apidock.com/rails/ActiveRecord/Persistence/touch)

  • 这不会运行回调!! 并且大多数时候你想要这样做是因为你想要运行父回调. (9认同)
  • 从最初的问题:`当创建/保存该对话中的新消息时,如何更新对话的updated_at属性?``.touch`方法主要用于更新时间戳.(来自文档:`使用设置为当前时间的updated_at/on属性保存记录.)`touch`的最常见用法可能是缓存过期.如果你想要回调,那就有一个`after_touch`回调. (3认同)

Ana*_*oly 40

在Message类中使用回调

after_save do
  conversation.update_attribute(:updated_at, Time.now)
end
Run Code Online (Sandbox Code Playgroud)

  • @HungryCoder在执行属性赋值时使用**self**来防止任何歧义(例如,您具有相同的局部变量名称).但在这种情况下**对话**不是局部变量,而是明确声明关联(比如方法的名称) (2认同)

小智 9

我更喜欢Rails 3的这个解决方案:

class Message < ActiveRecord::Base
  belongs_to :conversation

  after_save :update_conversation

  def update_conversation
    self.conversation.touch
  end
end
Run Code Online (Sandbox Code Playgroud)

资料来源:http://apidock.com/rails/ActiveRecord/Persistence/touch