Вы можете попробовать лямбду, как вы сказали, но я не уверен, сработает ли она. Примерно так:
belongs_to :article, :touch => Proc.new{|o| o.article && o.article.public }
В соответствии с реализацией может быть, вы можете попытаться вернуть nil
вместо false
в процедуре, когда она недоступна
belongs_to :article, :touch => Proc.new{|o| o.article && o.article.public ? true : nil }
Если это не работает, используйте обратный вызов перед сохранением, например:
class Model < ActiveRecord::Base
belongs_to :article
before_save :touch_public_parent
def touch_public_parent
article.touch if article && article.public?
end
end
Дайте мне знать, если у вас есть какие-либо вопросы.
Обновление № 1
Соответствующая часть от add_touch_callbacks
:
if touch_attribute == true
association.touch unless association.nil?
else
association.touch(touch_attribute) unless association.nil?
end
Так что если вы передадите true, тогда просто коснитесь атрибута updated_at
. Если вы передадите имя поля, то обновите это поле, если вы не передадите nil
. Если вы передадите nil, ничего не обновится. Вот почему я сказал, что, возможно, вы можете попробовать вторую версию belongs_to
ассоциации.