ruby-on-rails - 如何使用元编程进行 DRY?

标签 ruby-on-rails metaprogramming dry

似乎应该有一个通过 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

关于ruby-on-rails - 如何使用元编程进行 DRY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4858668/

相关文章:

ruby-on-rails - 助手中的 HAML 过滤器

html - 将简单的表单复选框变成切换开关

ruby-on-rails - find、where 和 find_by_id 之间有什么区别?

ruby-on-rails - Rails 模型的通用方法顺序

c++ - 如果模板中存在,如何获取成员函数指针

python-3.x - 将类的所有可能的方法调用包装在 try/except block 中

ruby-on-rails - ruby rails : Functional Testing: POST does not send raw XML data

c++ - 参数化特征 C++

ruby-on-rails - 晒干萝卜步骤定义

javascript - 你能在 React 组件类中添加一个外部函数作为方法吗?