Qual é a melhor maneira de gerenciar variáveis ??de configuração em tempo real com Ruby on Rails?
-
12-09-2019 - |
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?
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.