before_create,before_destroy,after_save和其他回调未在连接表上调用

时间:2014-12-17 10:46:48

标签: ruby-on-rails ruby

出于某种原因,在我的ror应用程序中创建/销毁联接表时,回调函数不会被调用。

class ImagesProducts < ActiveRecord::Base

  self.table_name = "images_products"

  self.primary_keys = :product_id, :image_id

  belongs_to :product, touch: true
  belongs_to :image, touch: true

  after_save { product.touch }

  def self.belonging_to(product_ids)
    belonging = where(product_id: product_ids)
    return belonging
  end

end

显然,product.touch在这里没有调用,我也尝试使用日志记录,但是当我创建或销毁其中一条记录时,似乎没有任何回调方法被触发。

由于某些原因,回调是否不能用于连接表?

1 个答案:

答案 0 :(得分:0)

  belongs_to :product, touch: true

  after_save { product.touch }

做同样的事情。但是,create无法调用触摸,因此您可能需要使用after_create回调:

after_create :touch_product

def touch_product
  self.product.touch
end

用于更新和销毁belongs_to :product, touch: true就足够了。

此行下方的touch更多信息:


http://apidock.com/rails/ActiveRecord/Persistence/touch

  

请注意,不会执行任何验证,只会执行after_touch,   执行after_commit和after_rollback回调。

另据我理解touch的工作方式,无论何时更新/销毁记录,相关的记录都将touch,并且只保存带有updated_at /的记录属性设置为当前时间,仅此而已。


来自 Active Record Callbacks http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

  

此外,只要有对象,就会触发after_touch回调   感动了。

因此,您可以在产品模型中使用此回调来执行销毁/更新image_product时所需的任何内容。


来自 ActiveRecord :: Associations :: ClassMethods http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

  

:touch如果为true,将触摸相关对象(   保存此记录时,updated_at / on属性设置为now   或被摧毁。如果指定符号,则将更新该属性   除了updated_at / on属性外,还有当前时间。