如何确定模型/嵌套模型中的任何字段是否更改?

时间:2011-04-11 00:08:53

标签: ruby-on-rails-3 activerecord

是否有一些快速的方法可以找出模型的任何字段或其嵌套模型(a.k.a. associations)的任何字段是否发生了变化?

5 个答案:

答案 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? }