Quelle est la meilleure façon de gérer les variables de configuration en temps réel avec Ruby on Rails?

StackOverflow https://stackoverflow.com/questions/1107446

Question

Je suis au courant des YAML et des plugins comme rails paramètres, mais aucun de ceux-ci est utile pour les paramètres de configuration qui doivent être modifiées en temps réel.

Par exemple, dire que j'ai MAX_ALLOWED_REGISTERED_USERS fixé à 2000, mais je veux vous à 2300. Avec une « configuration » typique ou d'une solution YAML, cela impliquerait la modification d'un fichier de configuration et en redéployant. Je préfère une approche RESTful base de données soutenue par où je pouvais changer une paire clé / valeur.

Pensées

Était-ce utile?

La solution

J'utilise un modèle de configuration similaire à ceci:

# == 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

Voici comment je l'utilise:

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

Une chose que je ne suis pas tout à fait satisfait est d'avoir à appeler #to_i comme dans l'échantillon, mais étant donné que cela fonctionne pour moi jusqu'à présent, je ne l'ai pas mis trop pensé à redessiner il.

Autres conseils

Moneta peut répondre à vos besoins, il est un système de stockage clé / valeur avec backends configurables:

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

Si vous utilisez une application multi-serveur, la configuration mutable doit être enregistrée de manière centrale (à moins que vous ne me dérange pas différents serveurs ayant des configurations différentes)

Comme affiché ci-dessus, Moneta est un bon choix, mais je parierais mecached est plus largement déployé aux côtés des applications Rails.

Voici une suggestion naïve: faire une table de base de données, la migration et ActiveRecord modèle et traiter votre config comme toute autre entité dans la base de données, moins un contrôleur et la vue. Juste une pensée.

Peut-être mettre ces données en memcached, et ont expirer assez souvent si vous êtes trop inquiet pour déranger la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top