2011-05-30 73 views
6

我意識到這不一定是最聰明的方式來做到這一點,但現在我的好奇心是活躍的,我很好奇如何做到這一點。動態方法上的導軌模型

我在Rails項目中有一個模型。我們將其稱爲Deal。每ActiveRecord和所有那些很酷的東西有數據庫中定義的列像UPDATED_AT和那些成爲交易的方法: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 

寫明白了。

但是如果我把它想ALWAYS有那天被添加到模型任何日期列的方法?

我看到了define_method那裏(一些在這裏StackOverflow)。所以我明白這一點。但是我想在ActiveRecord發揮它的魔力之後立即調用它,對嗎?所以如果我的交易模式有updated_at,created_at,offered_at和lawsuit_at我想每個匹配方法。更重要的是,如果另一位開發人員來到並添加了一個名爲scammed_at的列,我想要與scammed_at方法一起創建scammed_day。

我會怎麼做呢?

謝謝。

(*)呃,或者類似的東西,我總是看起來那個叫。

回答

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 ...

那麼你的想法,我認爲。請毫不猶豫地詢問詳細信息

+1

您可以在'if column.name =〜/ _at $ /'條件中包裝'define_method'調用。 – 2011-05-30 18:25:58

+0

你肯定是正確的,更正補充,謝謝 – apneadiving 2011-05-30 18:48:16

+0

所以,如果我只是在模型文件中添加它,我假定在我的其他方法def語句後,它會在數據庫定義列後加載? 這正是我想要的。 – 2011-05-30 18:54:33