是否可以在具有连接的ActiveRecord分组上执行多个计算?

时间:2014-02-27 20:48:25

标签: ruby-on-rails activerecord

假设您有一家餐厅,客户可以根据具体原因提出建议。 e.g。美味的食物,漂亮的座位,灿烂的笑容等等。

对于我想知道的单个服务器:

  1. 由于各种原因,收到的提示的总和是什么?
  2. 由于各种原因,收到了多少提示?
  3. 我已经实施acts_as_taggable_on来标记每个提示。模型是:

    # Tip -> Tagging <- Tag
    
    class Tip
      has_many :taggings,  :as => :taggable
      has_many :base_tags, :through => :taggings, :source => :tag
    
      attr_accessible :amount_cents, :recipient_id
    end
    
    class Tagging
      belongs_to :taggable
      belongs_to :tag
    end
    
    class Tag
      has_many :taggings
    
      attr_accessible :name
    end
    

    问题:以下两个查询有效。但我有预感,应该可以将两个计算组合成一个查询:

    Tip.joins(:taggings, :base_tags).where(recipient_id: server.id).group('tags.name').sum(:amount_cents)
    # => {"great-service" => 2400, "strong-coffee" => 4500}
    
    Tip.joins(:taggings, :base_tags).where(recipient_id: server.id).group('tags.name').count
    # => {"great-service" => 6, "strong-coffee" => 9}
    

    有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以运行查询一次,然后使用Ruby方法进行计算:

results = Tip.joins(:taggings, :base_tag).where(recipient_id: server.id).all

total_sum = results.map(&:amount_cents).sum
total_count = results.count

答案 1 :(得分:1)

5年后-我建议,考虑到使用数据库视图还是实体化视图。

一种选择是使用Scenic。这是一个与ActiveRecord集成在一起的Rubygem,用于在Rails中创建和管理数据库视图。