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

How to safely modify in memory mongoid model?

我在铁路项目上使用 mongoid gem,我对尝试修改内存中的模型但从未保存它感到非常困惑,所以我没有修改数据库。我正在尝试修改内存中加载的模型的属性,但它不起作用,如下所示:

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

所以我猜 mongo 每次我们第一次做时都会从数据库重新加载,甚至循环每个条目并设置一些属性没有效果,如果我再次循环我设置的所有属性仍然设置为原始价值。有没有办法提交事务并强制 mymodel 保持加载在内存中?我很难使用正确的术语,所以我希望你明白我在说什么。

调用 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来执行查询并将一堆模型实例从数据库中拉到本地内存中:

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

相同的模型实例