2009-07-10 9 views
2

Ich kenne YAML und Plugins wie Rails-Einstellungen, aber keiner von beiden ist nützlich für Konfigurationseinstellungen, die in Echtzeit geändert werden müssen.Was ist der beste Weg, um Echtzeitkonfigurationsvariablen mit Ruby on Rails zu verwalten?

Zum Beispiel, ich habe MAX_ALLOWED_REGISTERED_USERS auf 2000 gesetzt, aber ich möchte es bis 2300. Mit einer typischen "Konfiguration" oder YAML-Lösung würde dies eine Konfigurationsdatei ändern und neu implementieren. Ich würde einen datenbankgestützten REST-Ansatz bevorzugen, bei dem ich einfach ein Schlüssel/Wert-Paar ändern könnte.

Gedanken?

Antwort

3

ich ein Konfigurationsmodell ähnlich wie diese verwenden:

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

Hier ist, wie ich Verwenden Sie es:

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 

Eine Sache, die ich nicht ganz glücklich bin mit muss #to_i wie in der Probe anrufen, aber da es für mich so weit funktioniert, habe ich nicht zu viel darüber nachgedacht, es neu zu entwerfen.

0

Wenn Sie eine Multi-Server-Anwendung ausgeführt wird, wandelbar Konfiguration zentral gespeichert werden muss (es sei denn, Sie nicht unterschiedliche Server mit unterschiedlichen Konfigurationen nichts dagegen haben)

Wie oben geschrieben, ist Moneta eine gute Wahl, obwohl Ich würde wetten, mecached ist neben Rails-Anwendungen mehr verbreitet.

0

Hier ist ein naive Vorschlag: Machen Sie eine DB-Tabelle, Migration und ActiveRecord-Modell und behandeln Sie Ihre Konfiguration wie jede andere Entität in der Datenbank, abzüglich eines Controllers und Ansicht. Nur ein Gedanke.

Vielleicht setzen Sie diese Daten in memcached und lassen Sie es häufig genug ablaufen, wenn Sie zu besorgt über die Störung der Datenbank sind.

+0

Doh! Ich habe Matt Haleys Antwort im Grunde genommen dupliziert. Nun, ich schätze, meine Antwort ist eine Zusammenfassung des gesamten Codes, den er eingeführt hat, ohne dem faulen/zufälligen Leser (mir) zu sagen, wohin er gehen würde. – Roboprog

Verwandte Themen