2010-12-05 21 views
8

我有两个Rails模型,一个孩子和一个家长说。Rails中的相关模型和SUM查询

我知道我能做到这一点:

Child.sum(:income, :conditions => "parent_id = #{@parent_id}") 

但我希望能够做到这一点:

Parent.children.sum(:income) 

但是,这是给我的错误的价值观,如果我尝试它。是否有更简洁的书写方式

Child.sum(:income, :conditions => "parent_id = #{@parent_id}") 

TIA

[PS:Rails 3的开发环境]

回答

13

很抱歉,但我刚刚发现这个问题的答案。我需要将to_a添加到Child对象的集合中,然后调用proc,如下所示:

Parent.children.to_a.sum(&:income) 

这是一种魅力。

3

对不起,碰到一个旧的线程,但我想我找到了更好的(最好的?)解决方案。下面是我的项目,我结束了

self.purchases.where(:script_id => script_id, :approved => true).sum(:instances) 

它生成一个查询不正是我需要的

SELECT SUM("purchases"."instances") AS sum_id FROM "purchases" WHERE "purchases"."customer_id" = 1 AND "purchases"."script_id" = 1 AND "purchases"."approved" = 't' 
+0

我不得不说我喜欢这种想法在模型中发生一点点更好 – 2016-06-15 15:35:23

3

我跑到那里的孩子被委托给父母一个问题,我需要的代码找到一笔款项。

children.to_a.sum(:parent_income) 

给了我一个主要的N + 1问题。解决的办法是使用:

children.joins(:parent).sum(:income) 
0

我也导轨4如果被相符的项目是活跃或不活跃检查也碰到了类似的情况,这里是解决方案。我在保存之前在模型中运行了这个。

order_items.collect { |oi| oi.valid? ? (oi.quantity * oi.price) : 0 }.sum