【问题标题】:Associated models and SUM query in RailsRails 中的关联模型和 SUM 查询
【发布时间】:2011-05-20 15:31:43
【问题描述】:

我有两个 Rails 模型,一个 Child 和一个 Parent。

我知道我可以做到:

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

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

Parent.children.sum(:income)

但是,如果我尝试,这会给我错误的值。有没有更简洁的写法

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

?

TIA

[ps:Rails 3 开发环境]

【问题讨论】:

    标签: ruby-on-rails-3 associations sum


    【解决方案1】:

    抱歉,我刚刚找到了这个问题的答案。我需要将 to_a 添加到 Child 对象的集合中,并调用一个 proc,如下所示:

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

    这很有魅力。

    【讨论】:

      【解决方案2】:

      很抱歉碰到了一个旧线程,但我想我找到了更好的(最好的?)解决方案。以下是我最终完成的项目的代码

      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'
      

      【讨论】:

      • 我不得不说我更喜欢这种在模型中发生的想法
      【解决方案3】:

      我遇到了孩子委托给父母的问题,我需要找到一个总和。

      children.to_a.sum(:parent_income)
      

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

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

      【讨论】:

        【解决方案4】:

        我也遇到了类似的情况,这是 rails 4 中的解决方案,它还检查被统计的项目是活动的还是非活动的。我在保存之前在模型中运行了这个。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-13
          • 1970-01-01
          • 1970-01-01
          • 2017-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多