1

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

所以说产品 X 有 100 个变体,我想编辑其中一个变体。我查询该产品存在的所有变体。

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

选择 count = 1。
我调整第一条记录
更新计数 = 1

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

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

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

4

2 回答 2

3

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

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

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

于 2012-05-22T00:45:13.793 回答
1

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

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

编辑

这并没有完美地解决最初的问题,因为我没有通过“id”得到它,Dave 实际上是指“id”而不是“product_id”。我很高兴哈希技巧在答案方面仍然有帮助。

于 2012-05-22T00:40:46.650 回答