我的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
函数的方法?我哪里错了?
答案 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