Qual é a melhor maneira de gerenciar variáveis ??de configuração em tempo real com Ruby on Rails?

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

Pergunta

Eu estou ciente de YAML e plugins como rails-configurações, mas nenhum desses é útil para configurações que precisam ser alterados em tempo real.

Por exemplo, digamos que eu tenho MAX_ALLOWED_REGISTERED_USERS fixados em 2000, mas eu quero-se para 2300. Com uma "configuração" típico ou solução YAML, isso implicaria mudar um arquivo de configuração e reimplementando. Eu prefiro uma abordagem RESTful-backed banco de dados onde eu pudesse mudar um par chave / valor.

Os pensamentos?

Foi útil?

Solução

Eu uso um modelo de configuração semelhante a esta:

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

Aqui está como eu usá-lo:

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

Uma coisa que eu não estou muito feliz com é ter que chamar #to_i como na amostra, mas desde que ele funciona para mim até agora, eu não colocar muito pensamento em redesenhando-o.

Outras dicas

Moneta podem atender às suas necessidades, é um sistema de armazenamento de chave / valor, com backends configuráveis:

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

Se você estiver executando uma aplicação multi-servidor, necessidades de configuração mutáveis ??ser armazenados centralmente (a menos que você não se importa servidores diferentes com diferentes configurações)

Como postamos anteriormente, Moneta é uma escolha decente, embora eu aposto mecached é mais amplamente implantado ao lado de aplicações Rails.

Aqui vai uma sugestão ingênua: fazer uma tabela DB, migração e ActiveRecord-modelo e tratar a sua configuração como qualquer outra entidade no banco de dados, menos um controlador e vista. Apenas um pensamento.

Talvez colocar esses dados em memcached, e tê-lo expirar com freqüência suficiente, se você está muito preocupado com a perturbar o banco de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top