2012-01-15 41 views
6

我正在使用Rails 3.1.0,并且我只想在某些条件满足的情况下“触摸”belongs_to关联的父模型。只有在满足某些条件的情况下,如何“触摸”“belongs_to”关联的父模型?

例如,在这个时候,我有:

belongs_to :article, 
    :touch => true 

我想“碰”父模型只有当它是“公共”。也就是说,Article类有一个名为access@article.access =>publicprivate)的属性,我想之前“接触”来检查这个值:如果此值public,然后“碰”吧!

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

回答

4

就像你说的你可以试试拉姆达但我不确定它是否会工作。事情是这样的:

belongs_to :article, :touch => Proc.new{|o| o.article && o.article.public } 

按照implementation也许你可以尝试在proc返回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 

所以,如果你通过真实的,那么确实就updated_at属性简单的触摸。如果您传递字段名称,则会更新该字段,除非您通过nil。如果你通过零不会更新什么。这就是为什么我说,也许你可以尝试第二版belongs_to关联。

+0

没有与你在答案中链接的add_touch_callbacks方法相关的文档...你能说一些关于它的更多信息吗(例如:它是如何工作的)? – Backo 2012-01-16 04:48:14

+0

@Backo当然,请看我最新的答案。 – dombesz 2012-01-16 09:32:05

+0

非常感谢。见下一个问题/答案! – Backo 2012-01-16 11:18:23

0

我不认为你可以在belongs_to关联中应用触摸条件。

有一种方法是有点哈克但有belongs_to的关联直接合作,

这可能不是推荐的方式

 
class YourModel 
    belongs_to :article 
    belongs_to :public_article, :class_name=> "Article", 
      :foreign_key => "article_id", 
      :conditions => {:public => true} , :touch => true 
end 
+0

是否可以在':touch'选项值中使用'Proc' /'lambda'? – Backo 2012-01-15 17:31:10

+0

不,你不能使用proc或lambda,从文档引用“:touch =>如果为true,当这个记录被保存或销毁时,关联的对象将被触及(updated_at/on属性设置为现在)。如果您指定了一个符号,那么除了updated_at/on属性之外,该属性将使用当前时间更新。“ – 2012-01-15 18:05:55

+0

我刚刚打开另一个问题,以达到另一个解决方案:http://stackoverflow.com/questions/8872045/there-is-a-way-to-handle-after-save-and-after-destroy-equally。 – Backo 2012-01-15 18:10:04

相关问题