2011-04-11 108 views

回答

71

要查看某个ActiveRecord的对象发生了变化,您可以拨打:

instance.changed? 

要查看是否有特定属性改变时,你可以这样做:

instance.attr_changed? 

其中attr是属性你想检查。

要检查是否嵌套模式改变了,你可以这样做:

instance.nested_model.changed? 
+3

感谢您的回复!但是有没有什么办法可以在事先不知道模型有什么嵌套模型的情况下检查是否有嵌套模型的属性发生了变化? – Zabba 2011-04-11 00:33:31

+0

我会检查Rails Observers:http://api.rubyonrails.org/classes/ActiveRecord/Observer.html,它可能会通知父变更的模型。 – 2011-04-11 00:36:40

+0

我不认为nested_model(关联)更改被跟踪https://rails.lighthouseapp.com/projects/8994/tickets/541-dirty-attributes-with-associations – lulalala 2012-06-15 05:36:55

3

您可以确定通过调用一个对象是否已经改变,但尚未保存:

my_object.changed? 

你可以还要确定个人属性是否已更改(例如,您拥有first_name属性):

my_object.first_name_changed? 

就嵌套模型而言,我认为您必须分别拨打changed?

+0

感谢您的回复!但是有什么方法可以检查嵌套模型的属性是否发生了变化,而无需事先知道嵌套模型一个模型有? – Zabba 2011-04-11 00:32:25

+0

我不这么认为,可能有一个wa Ÿ获取所有关联模型的列表,但我不知道它是否在我头顶。正如迈克上面提到的那样,观察者可能是有用的。我可以问你想要达到什么效果吗?可能有更好的解决方案。 – 2011-04-11 00:49:53

+0

谢谢,这就是所谓的完美答案。 – 2016-05-12 07:43:58

6

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

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

parent_model_object.nested_model_name.previous_changes 

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