如果满足某些条件,如何"触摸"`belongs_to`关联的父模型?

Bac*_*cko 6 ruby ruby-on-rails touch ruby-on-rails-3 ruby-on-rails-3.1

我正在使用Rails 3.1.0,我想belongs_to只在满足某些条件时"触摸" 关联的父模型.

例如,此时我有:

belongs_to :article,
  :touch => true
Run Code Online (Sandbox Code Playgroud)

只有当它是"公共"时,我才会"触摸"父模型.也就是说,Article该类有一个名为access(@article.access=> publicprivate)的属性,我想在"触摸"之前检查这个值:如果这个值不是 public,那么"触摸"它!

是否可以在belongs_to关联声明中"直接"进行?如果是这样,怎么样?

dom*_*esz 6

你可以像你说的那样尝试 lambda,但我不确定它是否会起作用。像这样的东西:

belongs_to :article, :touch => Proc.new{|o| o.article && o.article.public }
Run Code Online (Sandbox Code Playgroud)

根据实现,当它不可用时,您可以尝试返回nil而不是false在 proc 中

belongs_to :article, :touch => Proc.new{|o| o.article && o.article.public ? true : nil }
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,请使用像这样的保存前回调:

class Model < ActiveRecord::Base
  belongs_to :article

  before_save :touch_public_parent

  def touch_public_parent
    article.touch if article && article.public?
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您有任何问题,请告诉我。

更新 #1

相关部分来自add_touch_callbacks

if touch_attribute == true
  association.touch unless association.nil?
else
  association.touch(touch_attribute) unless association.nil?
end
Run Code Online (Sandbox Code Playgroud)

因此,如果您传递 true,则对updated_at属性进行简单的触摸。如果您传递字段名称,则除非您通过nil. 如果您通过 nil 不会更新任何内容。这就是为什么我说也许你可以尝试第二个版本的belongs_to关联。