2012-06-21 20 views
10

Próbuję utworzyć async API z ramą Goliath. Serwis powinien pisać do mysql, dodawać wiadomości do RabbitMQ i odbierać odpowiedzi z powrotem. Powinna również istnieć osobna aplikacja administratora zbudowana z Railsami. Mam kilka pytań na ten temat:Aplikacja Rails i api goliath oraz bazy danych/modele udostępniające

Czy istnieje sposób skutecznego udostępniania modeli między Railsami a Goliatem? Czy są jakieś problemy z korzystaniem z Activerecord lub jakiegokolwiek innego programu z em? Czy są jakieś dobre praktyki, konfiguracja (rozmiar puli połączeń, sterownik) lub inne opcje na ten temat? Co muszę użyć, aby otrzymywać wiadomości od AMQP? Czy lepiej zbudować oddzielnego demona aplikacji lub mogę go użyć w jakiś sposób dla Goliata? Dzięki za zaliczkę.

Odpowiedz

4

Oto szybki hack do korzystania z modeli ActiveRecord w Goliath. Dzięki takiemu podejściu możesz korzystać z modelu bez konieczności używania, ale nie masz relacji na poziomie modelu. Aby uzyskać relacje has_many i belongs_to (w tym podejściu), wczytałem plik modelu i zawarłem linie zawierające takie słowa w pętli definicji klasy poniżej.

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 

To włamanie oparte na twoich opiniach.

+0

Btw: Klejnot ActiveRecord jest "activerecord", wymagany jest jak pokazano. – ringe

+1

W twoim przykładzie nie udostępniasz modelu z szynami. Również, jeśli mamy dużo logiki w modelach, nie jest bezpiecznie po prostu ich wymagać. Wymagane jest synchroniczne odłączanie logiczne. Również, jak wiecie, sqlite nie ma asynchronicznego sterownika – Bombazook

+1

Zmontowałem przykład, aby pokazać użycie modeli Rails, bez potrzeby. Problem z SQlite najlepiej rozwiązać przy użyciu innej bazy danych. – ringe