Rails用户可配置全局属性“默认值”的最佳实践

时间:2012-01-30 01:04:30

标签: ruby-on-rails ruby-on-rails-3

对于标题的尴尬措辞感到抱歉 - 不太确定标题的最佳方式,但这里是我看到的帮助:

在Rails应用中,我们假设我们有一个Product的模型,该产品的一个属性是Price

在我的应用的管理员方面,我希望能够设置"默认"如果创建的任何新Product未被分配Price,则可以参考的价格。如果Product 具有Price的值,则会使用它。

这当然是一个例子 - 我问这个问题,因为我必须想象这是一种常见的模式。这可以应用于可能具有用户可配置的全局默认值或特定于资源的值的任何资源。

在纯Ruby中,我认为这可以通过类变量来解决,因此我能够在@@default_price类中定义Product并且能够引用{ {1}}如果实例化对象的值不存在。

我的研究向我指出了rails-settings-cached宝石,它允许像Product.default_price这样的东西,但我想知道是否有更优雅(非插件)在基础Rails框架内完成此任务的方法。

注意我想在代码中设置此结构,但我希望能够通过我的应用程序定义实际值(即配置文件不是我正在寻找的解决方案)

有人可以用Rails的方式来启发我吗?

1 个答案:

答案 0 :(得分: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