从每个帐户中选择最新的

时间:2014-08-21 14:13:20

标签: ruby-on-rails ruby

我们有一个Model,AccountFeedback,看起来像这样

class AccountFeedback < ActiveRecord::Base {
                  :id => :integer,
          :account_id => :integer,
            :feedback => :text,
                 :nps => :integer,
          :created_at => :datetime,
          :updated_at => :datetime}

我需要在nps字段上进行计算。我需要平均nps分数。该平均值应仅根据account_id考虑每个帐户的最新AccountFeedback记录。

因此,如果我们有3条记录,两个来自一个帐户,另外一个来自另一个帐户,那么应该在2条记录上计算平均nps,这是每个帐户中最新的记录,基于created_at字段。我还需要另一个变量,它是计算中包含的记录数。

我不知道如何开始计算!

2 个答案:

答案 0 :(得分:0)

也许这样的事情对你有用:

vals = feedbacks.group_by {|acc| acc.account_id }.map {|account_id, accounts| accounts.first.nps }
avg = vals.inject{ |sum, el| sum + el }.to_f / vals.size
puts "avg = #{avg}, num_vals = #{vals.size}, vals = #{vals.inspect}"

使用一些数据库技巧可能有更好的方法。

答案 1 :(得分:0)

我最终很快就解决了。它需要重构,但这有效......

    @nps = 0
    @nps_accounts = AccountFeedback.select([:nps, 'MAX(created_at)']).group(:account_id).each do |record|
      @nps += record.nps
    end
    @nps_count = @nps_accounts.count
    @nps = @nps / @nps_accounts.count.to_f