Каков наилучший способ управления переменными конфигурации в реальном времени с помощью Ruby on Rails? - PullRequest
2 голосов
/ 10 июля 2009

Я знаю о YAML и плагинах, таких как rails-settings, но ни один из них не полезен для параметров конфигурации, которые необходимо изменить в реальном времени.

Например, скажем, у меня MAX_ALLOWED_R номе_USERS установлено на 2000, но я хочу увеличить его до 2300. При типичном решении "конфигурация" или YAML это потребует изменения файла конфигурации и повторного развертывания. Я бы предпочел подход RESTful на основе базы данных, где я мог бы просто изменить пару ключ / значение.

Мысли

Ответы [ 4 ]

3 голосов
/ 10 июля 2009

Я использую модель конфигурации, подобную этой:

# == 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, как в примере, но так как он работает для меня до сих пор, я не слишком много думал о его переработке.

0 голосов
/ 11 июля 2009

Вот наивное предложение: создайте таблицу БД, перенастройте и ActiveRecord-модель и обработайте вашу конфигурацию как любую другую сущность в базе данных, за исключением контроллера и представления. Просто мысль.

Возможно, поместите эти данные в memcached, и срок их действия истекает достаточно часто, если вы слишком беспокоитесь о нарушении работы базы данных.

0 голосов
/ 11 июля 2009

Если вы используете многосерверное приложение, изменяемая конфигурация должна храниться централизованно (если вы не возражаете против разных серверов с разными конфигурациями)

Как отмечалось выше, Moneta - достойный выбор, хотя я бы поспорил, что mecached более широко распространен наряду с приложениями Rails.

0 голосов
/ 10 июля 2009

Moneta может удовлетворить ваши потребности, это система хранения ключей / значений с настраиваемыми бэкэндами:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...