2010-05-11 73 views
2

this question一樣,我想在每個模型中調用acts_as_reportable,因此我可以在我的開發環境中在控制檯中執行一次性手動報告(轉儲生產數據)。在每個導軌模型中調用方法的DRY方式

這樣做的最好方法是什麼?將acts_as_reportable if ENV['RAILS_ENV'] == "development"放在每個模型中都變得單調乏味,而且根本不是很乾。大家都說猴子補丁是魔鬼,但一個混合似乎過分。

謝謝!

回答

1

如何創建一個Reportable類並從中導出所有模型?

class Reportable 
    acts_as_reportable if ENV['RAILS_ENV'] == "development" 
end 

class MyModel < Reportable 
end 
+0

哈!正如Throlkim所說,這基本上就是ApplicationController的等價物。如果這是一個好主意 - 它看起來對我來說 - 爲什麼它不是已經完成了?這將是一個很好的方式來進一步乾燥。 我想我可能不得不開始做這件事情。就目前而言,我將不得不去製作一些正則表達式來查找和替換我所有的Class行。不過我想我會選擇更通用的ApplicationModel。 ;-) – tjmcewan 2010-05-13 13:03:53

1

我用所有常用的方法我的模型一個mixin:

module ModelMixins 
    # Splits a comma separated list of categories and associates them 
    def process_new_categories(new_categories) 
     unless new_categories.nil? 
     for title in new_categories.split(",") 
      self.categories << Category.find_or_create_by_title(title.strip.capitalize) 
     end 
     self.update_counter_caches 
     end 
    end 
end 

我考慮過做它在其他方面,但對我來說,這似乎是乾涸的模型的最合法的途徑。與ApplicationController相當的模型將是一個很好的解決方案,但我不確定你會怎麼做,或者是否有反對擁有它的正當論點。

+0

我看到了這樣做的方式,即使它看起來過度殺傷,我確實想到了一些。據我所知,這將爲課堂增添一種新的方法。我想調用其他一些向類中添加方法的代碼,而不是直接自己添加方法。所以它必須是一些初始化方法或什麼,現在我的頭痛... 我認爲一個ApplicationModel是一個好主意(雖然其他人顯然不這樣做,否則我們會有它),是我一段時間以來,我曾考慮過各種原因。看起來像Draco Ater(上圖)有正確的想法... – tjmcewan 2010-05-13 12:59:07

3

對我來說,最好的方法是將它添加到初始化器中的ActiveRecord :: Base中。我相信acts_as_reportable是一個混合的引擎。通過這樣做,只能在開發環境中的所有模型中調用acts_as_reportable的所有方法。

我會在config/initializers目錄下,在一個名爲model_mixin.rb或任何你想要的文件中執行此操作。

class ActiveRecord::Base 
    acts_as_reportable if (ENV['RAILS_ENV'] == "development") 
end 

使用猴子補丁的說法很髒取決於你自己和代碼的可讀性,在我看來,使用你所熟悉的東西。該功能在那裏使用,它總是取決於用戶。

+0

這看起來是現在最快和最實用的方式。我想我最好先了解一下爲什麼猴子補丁首先是非常糟糕的,然後才讓自己過上一段不幸的生活。 – tjmcewan 2010-05-13 13:05:48