Как использовать метод map в методе класса ActiveRecord? - PullRequest
1 голос
/ 16 августа 2010

Не уверен в моем синтаксисе 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 жалуется на то, что для Class не определен метод map. Я ожидал, что self будет Array.

Как мне написать метод, который работает с коллекцией Invoices и использует функцию map? Куда я иду не так?

Ответы [ 2 ]

5 голосов
/ 13 октября 2014

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

3 голосов
/ 16 августа 2010

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

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