2011-02-01 32 views
2

好像應該是通過MP一個很好的辦法乾燥這件事:如何使用元編程進行乾燥?

class Dashboard 

    def self.num_registrations_past_day 
    return User.recent_registrations(24.hours.ago).count 
    end 

    def self.num_registrations_past_three_days 
    return User.recent_registrations(3.days.ago).count 
    end 

    def self.num_registrations_past_seven_days 
    return User.recent_registrations(7.days.ago).count 
    end 

    def self.num_registrations_past_month 
    return User.recent_registrations(30.days.ago).count 
    end 

    def self.avg_registrations_past_three_days 
    return (self.num_registrations_past_three_days/3.to_f) 
    end 

    def self.avg_registrations_past_seven_days 
    return (self.num_registrations_past_seven_days/7.to_f) 
    end 

    def self.avg_registrations_past_month 
    return (self.num_registrations_past_month/30.to_f) 
    end 

    def self.total_registered_users 
    return User.count 
    end 

    def self.total_activated_users 
    return User.total_activated 
    end 

end 

回答

5

我只想有傳入作爲參數時間長度:

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 
+0

將如何使用您的MP方法,你處理的平均? – keruilin 2011-02-02 02:26:10

0

如果您在使用這些函數的名稱設置我這樣做:

 

class Dashboard 

    def self.num_registrations_past_day 
    return User.recent_registrations(24.hours.ago).count 
    end 

    [['three_days', 3], ['seven_days', 7], ['month', 30]].each do |name, days| 
    class_eval <<-EVAL 
     def self.num_registrations_past_#{name} 
     User.recent_registrations(#{days}.days.ago).count 
     end 

     def self.avg_registrations_past_#{name} 
     self.num_registrations_past_#{name}/#{days}.to_f 
     end 
    EVAL 
    end 

    def self.total_registered_users 
    return User.count 
    end 

    def self.total_activated_users 
    return User.total_activated 
    end 

end