2012-06-21 10 views
10

Estoy tratando de crear una API asíncrona con el framework Goliath. El servicio debe escribir en mysql, agregar mensajes a RabbitMQ y recibir respuestas de vuelta. También debe haber una aplicación de administración separada construida con Rails. Tengo varias preguntas al respecto:Aplicación Rails y Goliath y bases de datos/modelos que comparten

¿Existe alguna forma de compartir efectivamente modelos entre Rails y Goliath? ¿Hay algún problema para usar Activerecord u otro orm con em? ¿Existen mejores prácticas, configuración (tamaño del grupo de conexiones, controlador) u otras opciones sobre eso? ¿Qué debo usar para recibir mensajes de AMQP? ¿Sería mejor construir un daemon de máquina de eventos por separado o puedo usar de alguna manera el de Goliath para esas cosas? Gracias por el avance.

Respuesta

4

Aquí hay un truco rápido para usar los modelos ActiveRecord en Goliath. Con este enfoque, puede usar el modelo sin usar require, pero no tiene las relaciones en el nivel del modelo. Para obtener las relaciones has_many y belongs_to (en este enfoque), cargaría el archivo de modelo e incluiría las líneas que contienen dichas palabras en el ciclo de definición de clases a continuación.

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 

Esto es un hack basado en sus comentarios.

+0

Por cierto: la gema de ActiveRecord es 'activerecord', el requerido es como se muestra. – ringe

+1

En su ejemplo, no comparte modelo con rieles. Además, si tenemos mucha lógica en los modelos, no es seguro simplemente requerirlos. El desacoplamiento lógico sincrónico es necesario. Además, como usted sabe, sqlite no tiene controlador asíncrono – Bombazook

+1

He editado el ejemplo para mostrar el uso de los modelos de Rails, sin requerirlo. El problema con SQlite se resuelve mejor usando una base de datos diferente. – ringe

Cuestiones relacionadas