Qual è il modo migliore per gestire le variabili di configurazione in tempo reale con Ruby on Rails?

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

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top