代码之家  ›  专栏  ›  技术社区  ›  Richard M

在after create回调中更新属性会导致更新整个记录

  •  5
  • Richard M  · 技术社区  · 14 年前

    在我的Rails应用程序中,我尝试使用 update_attribute 在一个 after_create 回拨。我可以成功地更新属性,但是由于某些原因,当我这样做时,所有模型的其他属性也会更新。因此,即使模型的name属性(例如)没有更改,它也会在数据库更新查询中设置(为当前值)。

    这是Rails(2.3.8)中预期的行为,还是我做错了什么?

    1 回复  |  直到 14 年前
        1
  •  6
  •   Sidane    14 年前

    是的,我相信这是一致的行为,因为刚刚创建的模型实例没有被重新加载。因此,“已更改”属性尚未重置。

    def my_after_save_callback
      require 'ruby-debug'; debugger
      update_attribute(:foo, "bar")
    end
    

    当调试器开始运行时:

    p self.changed
    

    将返回为此对象修改的所有属性的数组。ActiveRecord将在下次保存对象时更新所有这些属性。

    一种解决方法是在更新属性之前重新加载对象。

    def my_after_save_callback
      reload
      update_attribute(:foo, "bar")
    end
    

    希望有意义:-)