Rails技术问题:如何判断关联Zoo的zookeeper属性刚更新?
问题:在Animal#do_update_animal中判断关联Zoo的zookeeper属性是否刚更新
背景说明
我们有一对关联的Rails模型:
Zoo模型与Animal模型为has_many关联,代码如下:
after_commit :update_animals def update_animals animals.each(&:do_update_animal) end
Animal模型与Zoo模型为belongs_to关联,包含待实现逻辑的方法:
def do_update_animal # 此处需判断`self.zoo.zookeeper`属性是否刚更新 end
解决步骤
1. 修正Zoo的关联配置
要让Active Record的Dirty API正常作用于关联对象,必须在Zoo的has_many声明中添加inverse_of,明确反向关联:
has_many :animals, inverse_of: :zoo
2. 在Animal#do_update_animal中实现判断逻辑
利用Rails提供的Dirty API,有两种常用实现方式:
方式一:使用saved_change_to_*?方法(Rails 5+推荐)
该方法语义直观,直接返回布尔值,判断属性是否在本次保存中被修改:
def do_update_animal if self.zoo.saved_change_to_zookeeper? # 编写zookeeper属性更新后的处理逻辑 end end
若需获取修改前后的值,可调用saved_change_to_zookeeper,它会返回包含[旧值, 新值]的数组。
方式二:使用previous_changes哈希
previous_changes存储了本次保存中所有被修改的属性及其新旧值,通过判断键是否存在来确认属性是否更新:
def do_update_animal if self.zoo.previous_changes.key?('zookeeper') # 编写zookeeper属性更新后的处理逻辑 # 如需获取新旧值,可使用 self.zoo.previous_changes['zookeeper'] end end
内容的提问来源于stack exchange,提问作者duhaime
相关产品推荐
相关产品推荐

