【问题标题】:How to "touch" a parent model of a `belongs_to` association only if certain conditions are met?仅当满足某些条件时,如何“触摸”“belongs_to”关联的父模型?
【发布时间】:2012-01-15 15:43:00
【问题描述】:

我正在使用 Rails 3.1.0,并且我希望仅在满足某些条件时“触摸”belongs_to 关联的父模型。

例如,此时我有:

belongs_to :article,
  :touch => true

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

是否可以在belongs_to 关联声明中“直接”实现?如果有,怎么做?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 touch


    【解决方案1】:

    您可以按照您所说的尝试 lambda,但我不确定它是否会起作用。像这样的:

    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
    

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

    【讨论】:

    • 没有与您在答案中链接的add_touch_callbacks 方法相关的文档...您能多说一些吗(例如:它是如何工作的)?
    • 非常感谢。下一个问题/答案见!
    • 不客气,它与belongs_to 协会合作吗?
    • 我没有测试第一个和第二个代码或最后一个。我刚刚尝试了第三个(“如果这不起作用,请使用像这样的保存前回调”[...])。
    • 值得一提的是,add_touch_callbacks 方法在 after_saveafter_touchafter_destroy 上添加了钩子,而不是在此答案中指出的 before_save
    【解决方案2】:

    我认为您不能在 belongs_to 关联中应用带有条件的触摸。

    有一种方法有点老套,但可以直接与 belongs_to 关联一起工作,

    这可能不是推荐的方式

    类 YourModel 属于_to:文章 belongs_to :public_article, :class_name=> "文章", :foreign_key => "article_id", :conditions => {:public => true} , :touch => true 结尾

    【讨论】:

    • 是否可以在:touch选项值中使用一些Proc/lambda
    • 不,您不能使用 proc 或 lambda,引用文档,“:touch => 如果为真,则在此情况下将触摸关联的对象(updated_at/on 属性设置为 now)记录要么被保存,要么被销毁。如果你指定了一个符号,除了 updated_at/on 属性之外,该属性将被更新为当前时间。"
    • 我刚刚打开了另一个问题以找到另一个解决方案:stackoverflow.com/questions/8872045/…
    猜你喜欢
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多