如何使用元编程干?

似乎应该有一个很好的方式通过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 

我只需要将时间长度作为参数传递:

 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 

如果您设置使用这些函数名称,我会这样做:


类仪表板

   def self.num_registrations_past_day
    返回User.recent_registrations(24.hours.ago).count
  结束

   [['three_days',3],['seven_days',7],['month',30]]。每个都做|名称,天|
     class_eval <<  -  EVAL
       def self.num_registrations_past _#{name}
         User.recent_registrations(#{}天.days.ago).Count之间
      结束

       def self.avg_registrations_past _#{name}
         self.num_registrations_past _#{name} /#{days} .to_f
      结束
     EVAL
  结束

   def self.total_registered_users
    返回User.count
  结束

   def self.total_activated_users
    返回User.total_activated
  结束

结束