【问题标题】:How to determine if any field in a model / nested model changed?如何确定模型/嵌套模型中的任何字段是否更改?
【发布时间】:2011-04-11 00:08:53
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails-3 activerecord


    【解决方案1】:

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

    instance.changed?
    

    要查看特定属性是否已更改,您可以这样做:

    instance.attr_changed?
    

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

    要检查嵌套模型是否更改,您可以这样做:

    instance.nested_model.changed?
    

    【讨论】:

    • 感谢您的回复!但是有没有办法在事先不知道模型有哪些嵌套模型的情况下检查任何嵌套模型的属性是否发生了变化?
    • 我会检查 Rails 观察者:api.rubyonrails.org/classes/ActiveRecord/Observer.html,它可能会通知父模型更改。
    • 我不认为nested_model(关联)更改被跟踪rails.lighthouseapp.com/projects/8994/tickets/…
    • 我得到“未定义的方法‘改变了?’对于 #<:relation:0xfa07b3f> 当我在 rails 3.2.14 中执行 @message.groups.changed?
    • @SanoJ 我知道这是一个旧帖子,但回答是为了将来对某人有所帮助。因为,groups 是一个 has_many 关系,它将是一个数组,您必须这样做:@message.groups.any? { |g| g.changed? }@message.groups.any?(&amp;:changed?) 以检查任何关联的组是否已更改。对于has_onebelongs_to,请按照帖子所述进行操作。
    【解决方案2】:

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

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

    parent_model_object.nested_model_name.previous_changes
    

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

    【讨论】:

    • user.posts.previous_changes 这是正确的语法吗?
    【解决方案3】:

    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】:

      您可以通过调用来确定对象是否已更改但尚未保存:

      my_object.changed?
      

      您还可以确定个别属性是否已更改(例如您有一个first_name 属性):

      my_object.first_name_changed?
      

      就嵌套模型而言,我认为您必须分别对它们分别调用 changed?

      【讨论】:

      • 感谢您的回复!但是有没有办法在事先不知道模型有哪些嵌套模型的情况下检查任何嵌套模型的属性是否发生了变化?
      • 我不这么认为。可能有一种方法可以获取所有相关模型的列表,但我不知道它是否在我的脑海中。正如 Mike 上面提到的,Observers 可能很有用。我想问一下你想通过这一切实现什么,因为可能有更好的解决方案。
      【解决方案5】:

      对于accepts_nested_attributes_for,您可以使用model.things.detect { |thing| thing.id.blank? }

      【讨论】:

        猜你喜欢
        • 2016-06-23
        • 2013-05-26
        • 1970-01-01
        • 2013-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多