簡體   English   中英

Rails 上的動態方法 Model

[英]Dynamic Methods on a Rails Model

我意識到這不一定是最聰明的方法,但現在我的好奇心很活躍,我很好奇如何去做。

我在 Rails 項目中有一個 model。 我們稱之為交易。 根據 ActiveRecord 和所有很酷的東西,在數據庫中定義了像 UPDATED_AT 這樣的列,這些列成為 Deal 上的方法:deal.updated_at => '04/19/1966 3:15am'

假設我想使用告訴我星期幾而不是整個日期和時間的方法。 我意識到 DateTime class 上有一些方法,所以我可以做

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

但如果我只是想要

  deal.updated_day => 'Monday'

我可以寫在 deal.rb

  def update_day
    self.updated_at.day_of_week
  end

知道了。

但是,如果我希望它始終具有可用於添加到 model 的任何日期列的方法怎么辦?

我在那里看到了define_method(StackOverflow 上有一些)。 所以我明白這一點。 但我想在 ActiveRecord 發揮它的魔力之后立即調用它,對吧? 因此,如果我的 Deal model 有 update_at、created_at、offered_at 和訴訟_at,我希望每一個都匹配方法。 更重要的是,如果另一個開發人員來添加一個名為scammed_at 的列,我希望scammed_day 與scammed_at 方法一起創建。

我該怎么做?

謝謝。

(*) 呃,或者類似的東西,我總是看那個電話。

我想像下面這樣的東西應該可以解決問題。 在您的 model 中:

# 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方法......

好吧,你明白我的想法。 不要猶豫,詢問詳情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM