2012-05-22 80 views
0

我有一个产品表和一组该产品的变体。 我想加载给定产品的所有变体,然后更新单个记录。Rails:在activerecord集合中查找记录

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

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

SELECT COUNT = 1
和我调整的第一个记录= 1

现在我想这个集合其中ID = 10,但我不”在编辑的记录
更新计数不想回到数据库来记录下来。 我为什么要?我已经从第一个选择中获得了它,对吗?

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

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

回答

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”,戴夫实际上意味着“ID”,而不是“PRODUCT_ID”。我很高兴哈希技巧在答案方面仍然有帮助。

+0

我已经知道id => 10是产品1的一部分,所以我知道它会在我回来的集合中。我正在考虑将集合映射到一个散列,而你的小代码是完美的。 – baash05

+0

对不起,我完全不理解你的问题,但我很高兴我的回答碰巧包括你需要的东西:) –

+0

实际上这是我的代码在最后.. variation.reduce({}){| h,r | h [r.id] = r} – baash05

2

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

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

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

+0

我相信一个集合实际上只是一个数组。 – baash05

+0

你是对的 – DVG

+0

哦..现在我明白你做了什么..很聪明。我必须把这一点点放在我的脑海里。我去了哈希,但这也很聪明。 – baash05

相关问题