我有一个产品表和该产品的一组变体。 我想加载给定产品的所有变体,然后更新单个记录。
所以说产品X有100种变化,我想编辑其中一种变体。 我查询产品的所有变化。
vars = Variation.where(:product_id => 1) # => select * from variations
# where product_id = 1
选择计数= 1.
我调整了第一张唱片
更新计数= 1
现在我想编辑此集合中id = 10的记录,但我不想回到数据库来下拉记录。 我为什么要?我已经在第一个选择的内存中了,对吗?
我也想从记录中读取一些数据。说出变化的价格。
我绝对不想在数据库中查询内存中已有的数据。
答案 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”。我很高兴哈希技巧在答案方面仍然有用。