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