2012-01-30 50 views
1

對不起標題的措辭尷尬 - 不太清楚的所有權是最好的方法,但這裏是我所看到的援助:Rails的最佳實踐爲用戶配置的全局屬性「默認值」

在一個Rails應用程序,假設我們有一個Product的模型,並且該產品的一個屬性是Price

在我的應用的管理員端,我希望能夠設置一個「默認」價格,如果有任何新的Product創建的未被分配Price,可以引用該默認價格。如果Product確實的值爲Price,那麼它將被使用。

這當然是一個例子 - 我問這個問題是因爲我想象這是一種常見的模式。這可以應用於任何可能具有用戶可配置全局默認值或資源特定值的資源。

在純Ruby,這將是解決了,我想,有一類變量,所以我能夠在Product類中定義@@default_price,並能夠參考Product.default_price如果實例化對象的值不存在。

我在這裏的研究指向了rails-settings-cached gem,它允許類似MyApp.default_price這樣的東西,但我想知道是否有更優雅的(非插件)方式在基礎Rails框架內完成此操作。

注意我想在代碼中設置此結構,但我希望能夠通過我的應用程序定義實際值(即配置文件不是我正在尋找的解決方案)。

有人能夠用Rails的方式來啓發我嗎?

回答

0

ActiveRecord從數據庫模式中選取默認屬性值。但是,這些會被納入遷移和表架構中,而不是可配置的。

如果你想配置性,我已經使用的模式是before_validation回調方法來設置一個值,如果屬性是空白,如:

class Product < ActiveRecord::Base 

    before_validation :set_price_if_blank 
    validates :price, :presence => true # sanity check in case the default is missing 

    has_one :price 

    private 

    def set_price_if_blank 
    self.price = Price.default if self.price.blank? 
    end  

end 

class Price < ActiveRecord::Base 

    def self.default 
    @@default ||= Price.where(:default => true).first 
    end 

end 

這是假設你的價格表中填充了具有default標誌的行。你可以做到這一點,例如通過seeds.rb文件。我已經添加了一個驗證規則,以確保如果不存在缺省值,仍然會出現錯誤。它增加了您的應用程序的穩健性。

另請注意,最好對價格數據使用整數或小數,而不是浮點數。請參閱this answer

+1

這太好了 - 謝謝你Wolfram。我想我的本能並沒有離我們的本能還有很遠的距離來傾向於類變量:)一個問題 - 似乎讓Price成爲自己的類可能會增加一層複雜性。有沒有辦法在沒有這樣做的情況下實現這一點(即將Price作爲產品模型的簡單屬性)?再次感謝。 – nlh 2012-01-30 06:15:25