Qual è il modo migliore per gestire le variabili di configurazione in tempo reale con Ruby on Rails?
-
12-09-2019 - |
Domanda
Sono consapevole di YAML e plugin come rotaie-settings, ma nessuno di questi è utile per le impostazioni di configurazione che devono essere modificati in tempo reale.
Per esempio, dire che ho MAX_ALLOWED_REGISTERED_USERS trova a 2.000, ma voglio fino a 2300. Con un tipico "configurazione" o una soluzione YAML, ciò comporterebbe la modifica di un file di configurazione e la ridistribuzione. Io preferirei un approccio RESTful del database-backed, dove ho potuto solo cambiare una coppia chiave / valore.
Pensieri?
Soluzione
Io uso un modello di configurazione simile a questo:
# == 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
Ecco come lo uso:
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
Una cosa che non sono abbastanza soddisfatto è dover chiamare #to_i
come nel campione, ma dato che funziona per me finora, non ho messo troppo pensiero nel ridisegnare esso.
Altri suggerimenti
Moneta può soddisfare le vostre esigenze, si tratta di un sistema di stoccaggio chiave / valore con backend configurabili:
http: // yehudakatz.com/2009/02/12/initial-release-of-moneta-unified-keyvalue-store-api/
Se si sta eseguendo un'applicazione multi-server, la configurazione mutabile deve essere conservato in posizione centrale (a meno che non vi occupate di diversi server con configurazioni differenti)
Per quanto pubblicato in precedenza, Moneta è una buona scelta, anche se scommetto mecached è più ampiamente schierato al fianco di applicazioni Rails.
Ecco un suggerimento ingenuo: fare un tavolo di DB, la migrazione e ActiveRecord modello e curare la vostra configurazione come qualsiasi altra entità nel database, meno un controller e view. Solo un pensiero.
Forse mettere questi dati in memcached, e lo hanno scadono abbastanza di frequente se si è troppo preoccupato per disturbare il database.