2017-09-17 12 views
1

Sinatra REST APIからjson形式のデータを返そうとしています。私は現在、たくさんの団体が設定されていますが、私はRubyで簡単に入手できるにもかかわらず、私がAPIから望むビューを得るのが難しいです。例えばSinatraによるSequel関連の取得

、私のテーブルから:Rubyで

DB.create_table?(:calendars) do 
    primary_key :id 

end 

DB.create_table?(:schedules) do 
    primary_key :id 

    foreign_key :resource_id, :resources 
    foreign_key :task_id, :tasks 
    foreign_key :calendar_id, :calendars 
end 

、私はこのようなブロックを実行して、私の団体を通じて、私が必要とするすべての情報を表示することができるよ:

Calendar.each do |c| 
    c.schedules.each do |s| 
    puts "RESOURCE ##{s.resource_id}" 
    s.tasks.each do |t| 
     p t 
    end 
    puts 
    end 
end 

私のcalendarモデルにone_to_many :schedulesの関連が含まれているため、c.schedulesコールが機能しません。

これは私のSinatra APIにどのように変換されているのでしょうか。私の簡単なGET経路では、私は多くのバリエーションがカレンダーに関連付けられているスケジュールを取得し、JSONに変換しようと試みた:

get '/calendars' do 
    c = DB[:calendar].first 
    c.schedules.to_json 
    content_type :json 
end 

を...しかし、私はundefined method 'schedules' for {:id=>1}:Hash

のようなエラーになってしまいます

ここではハッシュが返ってきているようですが、私はたくさんのものを試しましたが、私がSinatraでどのように私の協会と仕事をしているのか分かりませんでした。これどうやってするの?

ありがとうございます!

答えて

0

理由あなたの最初のブロックは動作しますが、後者の場合には、あなたが続編datasetを使用しているのに対し、第二が最初のケースでは、あなたは、クラスCalendarの続編モデルインスタンスを使用しているしていないため

Calendar.each do |c|を反復処理すると、c変数にCalendarクラスSequelモデルオブジェクトのインスタンスが設定されます。このオブジェクトには関係メソッドが定義されており(one_to_many)、schedulesをクエリして他のモデルメソッドを実行することができます。

ただし、c = DB[:calendar].firstSequel datasetになります。このオブジェクトはモデルインスタンスとは異なり、標準のRubyハッシュ(またはハッシュの配列)を返します。

あなたが代わりにモデルを使用するように第二のブロックを変更することができますし、それはあなたが望む結果を得るでしょう:

get '/calendars' do 
    c = Calendar.first # <=== CHANGE FROM DATASET TO MODEL 
    c.schedules.to_json 
    content_type :json 
end 
関連する問題