【发布时间】:2011-04-11 00:08:53
【问题描述】:
是否有一些快速的方法可以找出模型的任何字段或它的嵌套模型(也称为关联)的任何字段是否发生了变化?
【问题讨论】:
标签: ruby-on-rails-3 activerecord
是否有一些快速的方法可以找出模型的任何字段或它的嵌套模型(也称为关联)的任何字段是否发生了变化?
【问题讨论】:
标签: ruby-on-rails-3 activerecord
要查看 ActiveRecord 对象是否已更改,您可以调用:
instance.changed?
要查看特定属性是否已更改,您可以这样做:
instance.attr_changed?
其中 attr 是您要检查的属性。
要检查嵌套模型是否更改,您可以这样做:
instance.nested_model.changed?
【讨论】:
has_many 关系,它将是一个数组,您必须这样做:@message.groups.any? { |g| g.changed? } 或 @message.groups.any?(&:changed?) 以检查任何关联的组是否已更改。对于has_one 和belongs_to,请按照帖子所述进行操作。
我知道这是个老问题,但最近遇到了同样的情况。
即使在保存对象之后,您也可以使用previous_changes 方法获取嵌套模型的所有更改。
parent_model_object.nested_model_name.previous_changes
这将列出嵌套模型中的所有更改以及旧值和新值。
【讨论】:
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]}
【讨论】:
您可以通过调用来确定对象是否已更改但尚未保存:
my_object.changed?
您还可以确定个别属性是否已更改(例如您有一个first_name 属性):
my_object.first_name_changed?
就嵌套模型而言,我认为您必须分别对它们分别调用 changed?。
【讨论】:
对于accepts_nested_attributes_for,您可以使用model.things.detect { |thing| thing.id.blank? }
【讨论】: