Quelle est la meilleure façon de gérer les variables de configuration en temps réel avec Ruby on Rails?
-
12-09-2019 - |
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
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.