2010-08-16 2 views
1

Не уверен в синтаксисе Ruby здесь.Как использовать метод «map» в методе класса ActiveRecord?

Я хочу определить метод, который я могу назвать следующим образом: 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

self wont be Array внутри класса Invoice. Это будет сам класс. –

ответ

3

Вы определили метод класса, который вызывается в самом классе. Что вам нужно, это association extension. Метод должен быть определен на модели клиента, как это:

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

Фантастический - еще одна полезная штука в головоломке Rails :) – nfm

4

Если вы хотите использовать карту в рамках методы класса, а не через расширение ассоциации. Например, если было бы полезно позвонить 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 используя любую коллекцию.

Смежные вопросы