2016-05-15 4 views
1

Ruby on Railsプロジェクトの問題の解決策を見つけるのが現在苦労しています。参照されたオブジェクトのツリーを使用したクエリ結果 - Ruby on Rails

私は以下のモデルの構造を有する:私はしたい、基本的に

{ 
     "rooms" : 
      [ 
       //room 1 
       { 
        "id": 1, 
        "param1": "dummy", 
        "photos": 
         [ 
          { 
           "id": 3, 
           "title": "test photo", 
           "points": 
            [ 
             {"id": 1, "text": "test point"}, 
             {"id": 2, "text": "test point"} 
            ] 
          } 
         ] 

       }, 
       //room 2 
       { 
        "id": 2, 
        // ... 
       } 
      ] 
    } 
 

:私はJSONがこのような構造を持っていると同じようにレンダリングされた何かを得るように、データベースを照会したい

class Room < ActiveRecord::Base 
    has_many :photos 
end 

class Photo < ActiveRecord::Base 
    belongs_to :room 
    has_many :points 
end 

class Point < ActiveRecord::Base 
    belongs_to :photo 
end 

をモデルの関係に従って構造化されたすべてのモデルのすべての情報を返すクエリを作成します。

時間を検索しましたが、これは単純な解決策が見つかりませんでした(複雑なものでもありません)。私は自分の問題に正しい検索キーワードを使用していないのかどうかはわかりませんが、実際に何かを見つけることができませんでした...

部分的な解決策(部屋と写真のみを取得する場合)この試みた:私が見つけたものから

Room.all.includes(:photos) 

を、私はそれが解決策になると考えていたが、それだけではない写真を、お部屋の情報を返すので、おそらくこれは私が必要なものとは全く異なるアプローチであります。

+0

あなたがそれを受け入れる場合は、あなたの提案された編集 –

答えて

3

@ dankohnの答えはネストされた関連付けを熱心に読み込んでいますが、to_jsonで作業するにはもう少し必要です。私が信じている問題は、to_jsonはオブジェクトの元のセットを見ているだけで、熱心なロードされた関連付けについてはわかりません。しかし、幸運にもto_jsonは、オプションのセットハッシュとしてインクルードを取ることができるメソッド呼び出しです。 (@ norim_13が正しい助けたことを元のコード内で問題があった。感謝!!)

Room.all.to_json({:include => { :photos => {:include => { :points => {}} }}}) 

https://www.tigraine.at/2011/11/17/rails-to_json-nested-includes-and-methods Rails: Eager loading as_json includes

はここas_json http://apidock.com/rails/ActiveModel/Serializers/JSON/as_json

、ここでソース内のドキュメントがありますto_jsonの場合、オプションのハッシュをas_jsonに渡すことができます。 http://apidock.com/rails/Hash/to_json

+0

最初のリンクはとても役に立ちました。必要なコードは、あなたが提案したものではありませんが、それは似たようなものです。作業コードを使って投稿への編集を提案します。 –

+0

素晴らしい、私は近くにうれしいです。 –

+1

誰かが私のためにそれを更新した、私は編集し、@ norim_13クレジットを与えた。ありがとう –

1

改訂:で

あなたは何を得るのです:あなたはポイントを壊すに取得する場合

Room.all.includes(photos: :points).to_json 

詳細情報については、Rails - Nested includes on Active Records?

+0

"Roomに 'points'という関連が見つかりませんでした。おそらく間違っているのでしょうか?」 テーブル「ポイント」を「ルーム」に関連付けていて、直接接続されていないためエラーが発生しています。 –

+0

私も試しました:Room.all.includes(:photos)。to_jsonですが、エラーは発生しませんが、内部の写真ではなく部屋の情報のみを返します。 –

+0

私はあなたの改訂された答えを見て、リンクをチェックし、あなたの提案は私が必要なものだと思われるが、それは動作しません...結果は、再び、部屋情報のみ... .all) –

0

を参照してください、それだけでシリーズを書く方が簡単な場合がありますそれぞれのループを作成し、json文字列を手作業で構築します。

Room.all.each do |room| 
    room.photos.each do |photo| 
    photo.points.each do |point| 
     // inner loop 
    end 
    end 
end 
+0

これに注意してください。これは、あなたが熱心な負荷をかけていない場合、クレイジーなN + 1クエリを生成します。 –

+0

提案していただきありがとうございます。誰かがすでに私に最も正しい「正しい」アプローチを与えてくれたとしても、私はおそらくこのようなものを使って、いくつかのオブジェクトにカスタムキーを与えることができます。 –

関連する問題