Приложение Rails и совместное использование API-интерфейса goliath и базы данных / моделей
Я пытаюсь создать асинхронный API с помощью Goliath Framework. Сервис должен писать в mysql, добавлять сообщения в RabbitMQ и получать ответы обратно. Также должно быть отдельное приложение администратора, созданное с помощью Rails. У меня есть несколько вопросов по этому поводу:
Есть ли способ эффективно обмениваться моделями между Rails и Goliath? Есть ли проблемы с использованием Activerecord или любой другой orm с em? Существуют ли передовые практики, конфигурация (размер пула соединений, драйвер) или другие варианты по этому поводу? Что я должен использовать для получения сообщений от AMQP? Было бы лучше создать отдельного демона eventmachine, или я мог бы как-то использовать Голиафа для этого? Спасибо за продвижение.
1 ответ
Вот быстрый взлом, чтобы использовать модели ActiveRecord в Голиафе. При таком подходе вы можете использовать модель без использования require, но у вас нет связей на уровне модели. Чтобы получить отношения has_many и own_to (в этом подходе), я бы загрузил файл модели и включил строки, содержащие такие слова, в цикл определения класса ниже.
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
Это взлом на основе ваших отзывов.