2

我使用 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"

为什么?

4

1 回答 1

3

默认情况下, Rails 模型是“脏”的,这意味着属性设置功能,attribute=()将属性标记为已更改,并告诉 Rails 在下次保存时更新此属性。此信息存储在模型中,而不是数据库中。在 上var.save,Rails 只更新它知道已更改的属性。如果 Rails 认为没有任何变化,它不会检查数据库是否存在差异(这在生产环境中会非常慢)。

您可以使用var.reload将属性从数据库重新加载到相应的对象中。

编辑:为了澄清上面的评论,你应该MyModel.last不在MyModel.first你的测试代码中使用。如果您的数据库中有不止一行,MyModel.first则不会引用最近保存的对象,因此var2var引用完全不同的对象。

于 2012-05-24T03:00:27.717 回答