我在轨道项目中使用mongoid gem,我很困惑,试图修改内存中的模型,但从不保存它,所以我不修改数据库。我正在尝试从内存中加载的模型修改属性,但它不能如下所示:
mymodel = MyModel.where('some criteria')
mymodel.first.some_attribute = 0
mymodel.first.some_attribute == 0 -> is false
所以我猜mongo每次首次执行时都会从db重新加载,甚至在每个条目上循环并设置一些属性没有效果,如果我再次循环,我设置的所有属性仍然设置为原始值。有没有办法提交事务并强制mymodel保持加载到内存中?我很难使用适当的术语,所以我希望你能得到我所说的。
答案 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
相同的模型实例