Rails:在activerecord集合中查找记录

时间:2012-05-22 00:11:36

标签: ruby-on-rails activerecord

我有一个产品表和该产品的一组变体。 我想加载给定产品的所有变体,然后更新单个记录。

所以说产品X有100种变化,我想编辑其中一种变体。 我查询产品的所有变化。

vars = Variation.where(:product_id => 1) # => select * from variations
                                         #       where product_id = 1

选择计数= 1.
我调整了第一张唱片 更新计数= 1

现在我想编辑此集合中id = 10的记录,但我不想回到数据库来下拉记录。 我为什么要?我已经在第一个选择的内存中了,对吗?

我也想从记录中读取一些数据。说出变化的价格。

我绝对不想在数据库中查询内存中已有的数据。

2 个答案:

答案 0 :(得分:2)

结果集实现了可枚举,所以你可以做这样有趣的事情:

my_collection = vars.find_all { |var| var.product_id == 10 }

这将产生一个子集作为一个数组,您可以继续做任何你想做的事。

答案 1 :(得分:1)

当您将条件传递给where时,您告诉ActiveRecord构建一个查询以仅从数据库中检索匹配的记录,因此当您要求Variation.where(:product_id => 1)时,您肯定没有加载一个(s)到product_id等于10的内存中。

如果您确实想要将所有记录加载到内存中,然后更新它们,那么您应该只使用Variation.all,并迭代结果。假设您知道任何给定的product_id值只应该有一个变体,那么您也可以将它们加载到一个带有product_ids作为键的哈希:Hash[ Variation.all.map{|v| [v.id, v]} ]

修改

这并没有完全解决原始问题,因为我没有通过“id”得到它,Dave实际上意味着“id”而不是“product_id”。我很高兴哈希技巧在答案方面仍然有用。