Приложение Rails и Goliath API и совместное использование базы данных/моделей

Я пытаюсь создать асинхронный API с платформой Goliath. Сервис должен писать в mysql, добавлять сообщения в RabbitMQ и получать ответы обратно. Также должно быть отдельное приложение администратора, созданное с помощью Rails. У меня есть несколько вопросов по этому поводу:

Есть ли способ эффективно обмениваться моделями между Rails и Goliath? Есть ли проблемы с использованием Activerecord или любой другой формы с ними? Существуют ли какие-либо рекомендации, конфигурация (размер пула соединений, драйвер) или другие параметры? Что я должен использовать для получения сообщений от AMQP? Было бы лучше создать отдельный демон машины событий, или я могу как-то использовать для этого демон Голиафа? Спасибо за аванс.


person gayavat    schedule 21.06.2012    source источник


Ответы (1)


Вот быстрый способ использования моделей ActiveRecord в Goliath. При таком подходе вы можете использовать модель без использования 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

Это взлом, основанный на ваших отзывах.

person ringe    schedule 25.06.2012
comment
Кстати: драгоценный камень ActiveRecord - это «activerecord», требование, как показано. - person ringe; 25.06.2012
comment
В вашем примере вы не делите модель с рельсами. Кроме того, если у нас много логики в моделях, небезопасно просто требовать их. Требуется синхронная логическая развязка. Также, как вы знаете, у sqlite нет асинхронного драйвера. - person Bombazook; 26.06.2012
comment
Я отредактировал пример, чтобы показать использование моделей Rails без необходимости. Проблему с SQlite лучше всего решить, используя другую базу данных. - person ringe; 27.06.2012