如何在ActiveRecord类方法中使用'map'方法?

时间:2010-08-16 09:34:47

标签: ruby-on-rails ruby activerecord collections map

我的Ruby语法不确定。

我想定义一个我可以这样调用的方法:client.invoices.average_turnaround。所以我的average_turnaround方法需要使用一组ActiveRecord对象。

到目前为止,这是我的代码:

class Invoice < ActiveRecord::Base
  ...
  def self.average_turnaround
    return self.map(&:turnaround).inject(:+) / self.count
  end
end

所以我试图找出每张发票的周转时间总和,然后将其除以发票总数。

Ruby抱怨没有为map定义Class方法。我期待self成为Array

如何编写适用于Invoices集合并使用map函数的方法?我哪里错了?

2 个答案:

答案 0 :(得分:5)

如果要在类方法中使用map而不是通过关联扩展。例如,如果直接或Invoice.average_turnaround致电Invoice.where(x: y).average_turnaround会很有用。将all.放在map前面。

class Invoice < ActiveRecord::Base
  ...
  def self.average_turnaround
    all.map(&:turnaround).inject(:+) / all.count
  end
end

使用任何集合average_turnaround

答案 1 :(得分:3)

您定义了一个类方法,该方法在类本身上调用。你需要的是association extension。应该在您的客户端模型上定义该方法,如下所示:

class Client < ActiveRecord::Base
  has_many :invoices do
    def average_turnaround
      return map(&:turnaround).inject(:+) / count
    end    
  end