Rails模型的动态方法

时间:2011-05-30 17:28:02

标签: ruby-on-rails activerecord

我意识到这不一定是最聪明的方法,但现在我的好奇心是活跃的,我很好奇如何来做这件事。

我在Rails项目中有一个模型。我们称之为Deal。每个ActiveRecord和所有那些很酷的东西都有数据库中定义的列,如UPDATED_AT,这些列成为Deal上的方法:deal.updated_at => '04 / 19/1966 3:15 am'

假设我想要的方法告诉我一周中的某一天,而不是整个日期和时间。我意识到DateTime类上有方法,所以我可以做

  deal.updated_at.day_of_week => 'Monday' (*)

但如果我只是想要

  deal.updated_day => 'Monday'

我可以写在deal.rb

  def update_day
    self.updated_at.day_of_week
  end

知道了。

但是,如果我希望始终将该方法用于添加到模型中的 ANY 日期列,该怎么办?

我在那里看到了define_method(StackOverflow上有一些)。所以我明白了。但我想在ActiveRecord发挥其魔力之后立即调用它,对吗?因此,如果我的交易模型有updated_at,created_at,provided_at和lawsuit_at,我会希望每个模型都有匹配的方法。更重要的是,如果另一位开发人员来了并添加了一个名为scammed_at的列,我希望scammed_day与scammed_at方法一起创建。

我该怎么做?

感谢。

(*)呃,或类似的东西,我总是看起来那个叫。

1 个答案:

答案 0 :(得分:8)

我想类似下面的内容应该可以解决问题。在你的模型中:

# looping through all model's columns
self.columns.each do |column|
  #if column's name ends with "_at"
  if column.name =~ /_at$/
    #create method like "udpated_day" 
    define_method "#{column.name[0..-4]}_day" do
      self.send(column.name).day_of_week
    end
  end
end

但它暗示每列都有一个有效的day_of_week方法......

嗯,你得到了我的想法。不要犹豫,询问细节