2

我知道 YAML 和 rails-settings 之类的插件,但是这些对于需要实时更改的配置设置都没有用。

例如,假设我将 MAX_ALLOWED_REGISTERED_USERS 设置为 2000,但我想将其提高到 2300。对于典型的“配置”或 YAML 解决方案,这将涉及更改配置文件并重新部署。我更喜欢数据库支持的 RESTful 方法,我可以只更改键/值对。

想法?

4

4 回答 4

3

我使用与此类似的配置模型:

# == Schema Information
# Schema version: 20081015233653
#
# Table name: configurations
#
#  id          :integer         not null, primary key
#  name        :string(20)      not null
#  value       :string(255)
#  description :text
#

class InvalidConfigurationSym < StandardError; end

class Configuration < ActiveRecord::Base
  TRUE  = "t"
  FALSE = "f"

  validates_presence_of   :name
  validates_uniqueness_of :name
  validates_length_of     :name, :within => 3..20 

  # Enable hash-like access to table for ease of use.
  # Raises InvalidConfigurationSym when key isn't found.
  # Example:
  #   Configuration[:max_age] => 80
  def self.[](key)
    rec = self.find_by_name(key.to_s)
    if rec.nil?
      raise InvalidConfigurationSym, key.to_s
    end
    rec.value
  end

  # Override self.method_missing to allow
  # instance attribute type access to Configuration
  # table. This helps with forms.
  def self.method_missing(method, *args)
    unless method.to_s.include?('find') # skip AR find methods
      value = self[method]
      return value unless value.nil?
    end
    super(method, args)
  end
end

这是我如何使用它:

class Customer < ActiveRecord::Base
  validate :customer_is_old_enough?

  def customer_is_old_enough?
    min_age = Date.today << (Configuration[:min_age].to_i * 12)
    self.errors.add(:dob, "is not old enough") unless self.dob < min_age
  end
end

我不太满意的一件事是不得不#to_i像在示例中那样调用,但由于它到目前为止对我有用,所以我没有过多考虑重新设计它。

于 2009-07-10T06:20:51.857 回答
0

Moneta 可能适合您的需求,它是一个具有可配置后端的键/值存储系统:

http://yehudakatz.com/2009/02/12/initial-release-of-moneta-unified-keyvalue-store-api/

于 2009-07-10T05:56:05.603 回答
0

如果您正在运行多服务器应用程序,则需要集中存储可变配置(除非您不介意具有不同配置的不同服务器)

如上所述,Moneta 是一个不错的选择,尽管我敢打赌mecached与 Rails 应用程序一起部署得更广泛。

于 2009-07-10T23:59:57.880 回答
0

这是一个天真的建议:创建一个数据库表、迁移和 ActiveRecord 模型,并将您的配置视为数据库中的任何其他实体,减去控制器和视图。只是一个想法。

或许将这些数据放在 memcached 中,如果您太担心会干扰数据库,请让它足够频繁地过期。

于 2009-07-11T00:16:04.220 回答