如何操作ActiveRecord :: Relation结果并过滤它而不再查询数据库

时间:2014-09-12 13:02:01

标签: ruby-on-rails-4 rails-activerecord

我想检索记录表格,初始化一些字段,然后在某些过滤器后更新内存上的数据(不保存到数据库)。但是这个第二个过滤器对数据库进行了新的查询,所以我无法初始化这些字段。

我该如何解决这个问题?

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方法不会对数据库执行查询

1 个答案:

答案 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!