2012-06-21 39 views
10

Tôi đang cố tạo api không đồng bộ với khung Goliath. Dịch vụ nên ghi vào mysql, thêm tin nhắn vào RabbitMQ và nhận phản hồi. Cũng cần có một ứng dụng quản trị riêng biệt được tạo bằng Rails. Tôi có một số câu hỏi về điều đó:Ứng dụng Rails và api goliath và cơ sở dữ liệu/mô hình chia sẻ

Có cách nào để chia sẻ hiệu quả các mô hình giữa Rails và Goliath không? Có vấn đề gì khi sử dụng Activerecord hay bất kỳ orm nào khác với em không? Có bất kỳ thực hành tốt nhất, cấu hình (kích thước hồ bơi kết nối, trình điều khiển) hoặc các tùy chọn khác về điều đó? Tôi phải sử dụng những gì để nhận tin nhắn từ AMQP? Nó sẽ tốt hơn để xây dựng một daemon eventmachine riêng biệt hoặc tôi có thể sử dụng bằng cách nào đó Goliath của một trong những công cụ đó? Cảm ơn bạn đã tạm ứng.

Trả lời

4

Đây là một bản hack nhanh để sử dụng các mô hình ActiveRecord trong Goliath. Với cách tiếp cận này, bạn có thể sử dụng mô hình mà không cần sử dụng, nhưng bạn không có mối quan hệ ở cấp mô hình. Để có được các mối quan hệ has_many và attributes_to (trong phương pháp này), tôi sẽ tải tệp mô hình và bao gồm các dòng chứa các từ đó trong vòng định nghĩa lớp bên dưới.

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 

Đây là bản hack dựa trên phản hồi của bạn.

+0

Btw: Đá quý ActiveRecord là 'activerecord', yêu cầu được hiển thị. – ringe

+1

Trong ví dụ của bạn, bạn không chia sẻ mô hình với đường ray. Ngoài ra nếu chúng ta có nhiều logic trong các mô hình thì không an toàn khi chỉ yêu cầu chúng. Cần tách rời logic đồng bộ. Cũng như bạn biết sqlite đã không async lái xe – Bombazook

+1

Tôi đã chỉnh sửa ví dụ để hiển thị sử dụng các mô hình Rails, mà không cần. Vấn đề với SQlite được giải quyết tốt nhất bằng cách sử dụng một cơ sở dữ liệu khác. – ringe

Các vấn đề liên quan