ruby-on-rails - 在创建后回调中更新属性会导致更新整个记录

标签 ruby-on-rails

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

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

最佳答案

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

对不起,如果这不是一个非常清楚的解释。为了演示,请在您的 after_create 方法中运行调试器。例如。

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

这将重置“已更改”属性,并且只有您修改的特定属性会在 SQL 查询中更新。

希望这是有道理的:-)

关于ruby-on-rails - 在创建后回调中更新属性会导致更新整个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619536/

相关文章:

ruby-on-rails - Rails 使用类似于 counter_cache 的 bool 值?

javascript - 如何使用 Jquery 重新加载特定的 div?

javascript - 如何让 JavaScript 文件在 Rails 5 应用程序上运行

ruby-on-rails - 最小化 json 文档大小会提高 Elasticsearch 的性能吗?

ruby-on-rails - 替代 Cucumber 的集成测试工具

ruby-on-rails - 将 Microsoft 时区转换为 Rails 中的标准时区数据

ruby-on-rails - Rspec 跳过 Controller 中的设计操作 - sign_in_and_redirect

jquery - Javascript 在第一次加载时不起作用

ruby-on-rails - CSS 未在应用程序中加载

ruby-on-rails - Rails respond_with 输出 json 并尝试将其作为方法调用