如何安全地修改内存中的mongoid模型?

时间:2016-06-09 18:44:07

标签: ruby-on-rails mongodb ruby-on-rails-3 mongoid

我在轨道项目中使用mongoid gem,我很困惑,试图修改内存中的模型,但从不保存它,所以我不修改数据库。我正在尝试从内存中加载的模型修改属性,但它不能如下所示:

mymodel = MyModel.where('some criteria')
mymodel.first.some_attribute = 0
mymodel.first.some_attribute == 0 -> is false

所以我猜mongo每次首次执行时都会从db重新加载,甚至在每个条目上循环并设置一些属性没有效果,如果我再次循环,我设置的所有属性仍然设置为原始值。有没有办法提交事务并强制mymodel保持加载到内存中?我很难使用适当的术语,所以我希望你能得到我所说的。

1 个答案:

答案 0 :(得分:1)

调用first是一个查询,因此这是两个不同的查询:

M.first
M.first

和数据库的两次点击,产生两个完全不同的模型实例。类似地,两次调用M.each { ... }(或其他一些迭代方法)将命中数据库两次并生成两组完全不同的模型实例。您可以查看#object_id所说的内容来验证这一点。

如果你想加载对象并对它们做些事情,那就明确一下:

m = M.first
m.attr = 0
# Now m.attr == 0 will be true and you can m.save to update the database

对于迭代,您可以调用#to_a来执行查询,并将一堆模型实例从数据库中拉入本地内存:

ms = M.some_query.to_a    ms.each {...}    ms.each {...}#遍历与第一个ms.each

相同的模型实例