我使用 rails 控制台创建了一个模型记录,然后使用新变量检索并更新一些字段:
var = MyModel.new
var.name = "my name"
var.save
var2 = MyModel.last
var2.name = "your name"
var2.save
现在回到旧变量var.save
只是返回true
并且不会将name
字段覆盖为其值:"my name"
为什么?
我使用 rails 控制台创建了一个模型记录,然后使用新变量检索并更新一些字段:
var = MyModel.new
var.name = "my name"
var.save
var2 = MyModel.last
var2.name = "your name"
var2.save
现在回到旧变量var.save
只是返回true
并且不会将name
字段覆盖为其值:"my name"
为什么?
默认情况下, Rails 模型是“脏”的,这意味着属性设置功能,attribute=()
将属性标记为已更改,并告诉 Rails 在下次保存时更新此属性。此信息存储在模型中,而不是数据库中。在 上var.save
,Rails 只更新它知道已更改的属性。如果 Rails 认为没有任何变化,它不会检查数据库是否存在差异(这在生产环境中会非常慢)。
您可以使用var.reload
将属性从数据库重新加载到相应的对象中。
编辑:为了澄清上面的评论,你应该MyModel.last
不在MyModel.first
你的测试代码中使用。如果您的数据库中有不止一行,MyModel.first
则不会引用最近保存的对象,因此var2
会var
引用完全不同的对象。