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は適切な選択ですが、mecachedはRailsアプリケーションと一緒にもっと広く展開されていると思います。

于 2009-07-10T23:59:57.880 に答える
0

これは単純な提案です: DB テーブル、マイグレーション、および ActiveRecord モデルを作成し、コントローラーとビューを除いて、データベース内の他のエンティティと同様に構成を扱います。ちょっとした考え。

おそらく、このデータを memcached に置き、データベースの妨害を心配しすぎる場合は、頻繁に期限切れになるようにしてください。

于 2009-07-11T00:16:04.220 に答える
0

Moneta は、構成可能なバックエンドを備えたキー/値ストレージ システムであり、ニーズに合うかもしれません。

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

于 2009-07-10T05:56:05.603 に答える