В качестве аргумента я просто передал бы отрезок времени:
def self.num_registrations_since(time)
User.recent_registrations(time).count
end
def self.avg_registrations_since(time)
self.num_registrations_since(time) / ((Time.now - time) / 1.day)
end
Видите, это все еще очень читабельно:
Dashboard.num_registrations_since(3.days.ago)
Dashboard.avg_registrations_since(7.days.ago)
Для забавы, вот способ метапрограммирования:
{ :day => 24.hours.ago,
:three_days => 3.days.ago,
:seven_days => 7.days.ago,
:month => 30.days.ago }.each do |method_suffix, time|
define_singleton_method "num_registrations_past_#{method_suffix}" do
User.recent_registrations(time).count
end
define_singleton_method "avg_registrations_past_#{method_suffix}" do
self.send("num_registrations_past_#{method_suffix}") / ((Time.now - time) / 1.day)
end
end