回调belongs_to关联rails
Posted
技术标签:
【中文标题】回调belongs_to关联rails【英文标题】:Call Back for belongs_to association rails 【发布时间】:2015-03-13 19:17:25 【问题描述】:就像after_add
回调has_and_belongs_to_many
关联一样,是否有任何回调或解决方法来获取belongs_to 关联的after_add 功能。
一种解决方法是在保存回调和脏对象功能之后/之前使用。
belongs_to :video
after_save :after_save_task
def after_save_task
do_stuff if video_id_changed?
end
def do_stuff
### do stuff
end
但我不能在 do_stuff 中 save(true)
,因为它进入了无限循环。
【问题讨论】:
【参考方案1】:似乎尚未添加为 has_on 和 belongs_to 添加回调的功能。看到这个帖子https://github.com/rails/rails/issues/586
针对您的特定问题的一个肮脏的解决方案是添加一些肮脏的属性来建议是否已经进行了更新。
喜欢这个
belongs_to :video
after_save :after_save_task
attr_accessor :stuff_done
def after_save_task
do_stuff if video_id_changed? && !stuff_done
end
def do_stuff
stuff_done = true
### do stuff
## Saving record here would be fine.
end
这又是一个真正的 hack,可能存在一些更好的解决方案。
【讨论】:
谢谢,这是解决方案之一。我发现的另一个方法是使用 update_column,这样可以避免回调。【参考方案2】:重写setter方法怎么样? Rails 指南的考试为this here
摘录哪些州
覆盖生成的方法
关联方法在一个模块中生成,该模块包含在 模型类,它允许您轻松地用自己的覆盖 方法并使用 super 调用原始生成的方法。为了 示例:
class Car < ActiveRecord::Base belongs_to :owner belongs_to
:old_owner
def owner=(new_owner)
self.old_owner = self.owner
super
end
end
如果您的模型类是 Project,则模块名为 项目::生成的关联方法。生成的关联方法 模块被包含在模型类中 (匿名)生成的属性方法模块,意思是 关联将覆盖具有相同属性的方法 名字。
我很欣赏这是一个老问题,但我偶然发现它正在寻找类似的解决方案
【讨论】:
以上是关于回调belongs_to关联rails的主要内容,如果未能解决你的问题,请参考以下文章
Rails 5:将belongs_to关联与自定义名称添加到模型和迁移
Rails ActiveRecord - 获取与锁定的belongs_to关联
以编程方式获取 Rails 4 中的 belongs_to 关联的类