2012-06-21 3 views
10

Ich versuche async api mit Goliath Framework zu erstellen. Der Dienst sollte in mysql schreiben, Nachrichten zu RabbitMQ hinzufügen und Antworten zurück erhalten. Es sollte auch eine separate Admin-Anwendung geben, die mit Rails erstellt wurde. Ich habe mehrere Fragen dazu:Rails app und goliath api und database/models sharing

Gibt es eine Möglichkeit, Modelle zwischen Rails und Goliath effektiv zu teilen? Gibt es irgendwelche Probleme, Activetrecord oder irgendein anderes orm mit em zu benutzen? Gibt es Best Practices, Konfiguration (Größe des Verbindungspools, Treiber) oder andere Optionen? Was muss ich verwenden, um Nachrichten von AMQP zu empfangen? Wäre es besser, einen separaten eventmachine-Daemon zu erstellen, oder kann ich irgendwie Goliaths für dieses Zeug benutzen? Danke für den Fortschritt.

Antwort

4

Hier ist ein kurzer Hack, um ActiveRecord-Modelle in Goliath zu verwenden. Mit diesem Ansatz können Sie das Modell ohne require verwenden, aber Sie haben keine Beziehungen auf der Modellebene. Um die Beziehungen has_many und ances_to zu erhalten (in diesem Ansatz), würde ich die Modelldatei laden und die Zeilen, die solche Wörter enthalten, in die darunter liegende Klassendefinitionsschleife einfügen.

require 'goliath' 
    require 'active_record' 
    require 'active_support' 

    # The location of the Rails app to integrate 
    RAILS_APP ||= ENV['HOME']+"/dev/qtrack" 

    # Load the ActiveRecord database configuration, development settings 
    configpath = File.join(RAILS_APP, "config", "database.yml") 
    config = YAML::load_file(configpath) 
    ActiveRecord::Base.establish_connection config["development"] 

    # Set the names of all Rails models to a constant 
    MODELS ||= [] 
    models_dir = File.join(RAILS_APP, "app", "models") 
    model_names = Dir[models_dir+"/*.rb"] 

    # Loop over each file name, define a class for each 
    model_names.each do |fname| 
     mname = File.basename(fname, '.rb').titleize.sub(/ /, '') 
     eval %Q{ 
     class ::#{mname} < ActiveRecord::Base 
     end 
     } 
     m = mname.constantize 
     MODELS << m unless MODELS.include?(m) 
    end 

    class Hello < Goliath::API 
     # default to JSON output, allow Yaml as secondary 
     use Goliath::Rack::Render, ['json', 'yaml'] 

     def response(env) 
     # Create a Hash with each model name and the object count 
     models = MODELS.inject({}) {|hsh,model| hsh[model] = model.count; hsh } 
     [200, {}, models.to_json ] 
     end 
    end 

Dies ist ein Hack basierend auf Ihrem Feedback.

+0

Btw: Der ActiveRecord-Edelstein ist 'activerecord', die Anforderung ist wie gezeigt. – ringe

+1

In Ihrem Beispiel teilen Sie Modell nicht mit Schienen. Auch wenn wir viel Logik in Modellen haben, ist es nicht sicher, sie einfach zu verlangen. Eine synchrone logische Entkopplung wird benötigt. Auch wie Sie wissen, sqlite hat nicht Async-Treiber – Bombazook

+1

Ich habe das Beispiel bearbeitet, um die Verwendung von Rails-Modellen zu zeigen, ohne erfordern. Das Problem mit SQlite löst man am besten mit einer anderen Datenbank. – ringe