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

Zab*_*bba 40 activerecord ruby-on-rails-3

有没有一些快速的方法可以找出模型的任何字段或其嵌套模型(也称为关联)的任何字段是否发生了变化?

Mik*_*wis 78

要查看ActiveRecord对象是否已更改,您可以调用:

instance.changed?
Run Code Online (Sandbox Code Playgroud)

要查看特定属性是否已更改,您可以执行以下操作:

instance.attr_changed?
Run Code Online (Sandbox Code Playgroud)

其中attr是您要检查的属性.

要检查嵌套模型是否已更改,您可以执行以下操作:

instance.nested_model.changed?
Run Code Online (Sandbox Code Playgroud)

  • 我得到"未定义的方法`改变了吗?" for#<ActiveRecord :: Relation:0xfa07b3f>当我在rails 3.2.14中执行@ message.groups.changed? (4认同)
  • 谢谢你的回复!但有没有办法检查是否有任何嵌套模型的属性发生了变化,而事先不知道模型有哪些嵌套模型? (3认同)
  • @SanoJ我知道这是一个老帖子,但回答这个问题以便将来帮助某人.因为,groups是一个`has_many`关系,它将是一个数组,你将不得不这样做:`@ message.groups.any?{| g | g.changed?}`或`@ message.groups.any?(&:changed?)`来检查关联的任何组是否已更改.对于`has_one`和`belongs_to`,如帖子所说. (3认同)

小智 6

我知道这是一个老问题,但最近遇到了同样的情况.

previous_changes即使在保存对象后,您也可以使用方法获取嵌套模型的所有更改.

parent_model_object.nested_model_name.previous_changes
Run Code Online (Sandbox Code Playgroud)

这将列出嵌套模型中的所有更改以及旧值和新值.


Ste*_*eve 6

使用 5.1 + 以下内容对我有用:

saved_changes? 将让您知道您的对象是否已更改:

my_object.saved_changes?
=> true
Run Code Online (Sandbox Code Playgroud)

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]}
Run Code Online (Sandbox Code Playgroud)