出于某种原因,在我的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在这里没有调用,我也尝试使用日志记录,但是当我创建或销毁其中一条记录时,似乎没有任何回调方法被触发。
由于某些原因,回调是否不能用于连接表?
答案 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属性外,还有当前时间。