是否有一些快速的方法可以找出模型的任何字段或其嵌套模型(a.k.a. associations)的任何字段是否发生了变化?
答案 0 :(得分:75)
要查看ActiveRecord对象是否已更改,您可以调用:
instance.changed?
要查看特定属性是否已更改,您可以执行以下操作:
instance.attr_changed?
其中attr是您要检查的属性。
要检查嵌套模型是否已更改,您可以执行以下操作:
instance.nested_model.changed?
答案 1 :(得分:6)
我知道这是一个老问题,但最近遇到了同样的情况。
即使在保存对象后,您也可以使用std::vector
方法获取嵌套模型的所有更改。
previous_changes
这将列出嵌套模型中的所有更改以及旧值和新值。
答案 2 :(得分:3)
您可以通过调用以下方式确定对象是否已更改但尚未保存:
my_object.changed?
您还可以确定各个属性是否已更改(例如,您有first_name
属性):
my_object.first_name_changed?
就嵌套模型而言,我认为你必须分别在它们上面调用changed?
。
答案 3 :(得分:1)
在5.1及以下版本中对我有效:
saved_changes?
会通知您对象是否已更改:
my_object.saved_changes?
=> true
saved_changes
将让您知道哪些字段已更改,每个字段的前值和后值:
my_object.saved_changes
=> {"first_name"=>['Jim', 'Jimmy'], "updated_at"=>[Thu, 06 Dec 2018 18:45:00 UTC +00:00, Thu, 06 Dec 2018 18:52:44 UTC +00:00]}
答案 4 :(得分:0)
对于accepts_nested_attributes_for
,您可以执行model.things.detect { |thing| thing.id.blank? }