我想检索记录表格,初始化一些字段,然后在某些过滤器后更新内存上的数据(不保存到数据库)。但是这个第二个过滤器对数据库进行了新的查询,所以我无法初始化这些字段。
我该如何解决这个问题?
res=where(code: 0) # (1) retrieve objects from db, as a template
res.each{|r| r.amount=10} # (2) change amount field with 10 in res
这里我希望10 + 2,但结果是0 + 2:因为下一行在数据库上执行查询,所以第(2)行没有效果
res.where("caconana='1221").first.amount+= 2
可能的答案:有没有比将'res'转换为数组更好的解决方案?
res=where(code: 0).to_a
res.each{|r| r.amount=10}
i=res.find_index{|r| r.caconana=='1221'}
res[i]+=2
感谢PSKocit我有解决方案: find方法不会对数据库执行查询
答案 0 :(得分:2)
每个方法调用res都会导致所有匹配的ActiveRecords对象无论如何都要完全构造。因此,如果你确实想要构造它们,你也可以使用加载的caconana属性:
res.each {|r| r.amount = 10 }
res.find {|r| r.caconana == 1221 }.amount+=2
(然后你需要save
每条记录都要将其提交给数据库。)
您可以使用以下命令避免某些ActiveRecord对象构造:
where(code: 0).update_all(amount: 10) #One query to the database, no AR objects constructed in memory
然后进行递增(这是使用AR对象构建,但它仅用于一条记录)
obj = where(code: 0).where(caconana: 1221).limit(1).first
obj.amount+=2
#obj.save!