2012-01-30 62 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