2

どうすればこれを機能させることができるのだろうか。クライアントに属するプロジェクトのモデルがあると仮定します。これらの特定のプロジェクトをJSONに出力したいのですが、クライアントごとにグループ化する必要があります。私はこれがうまくいくと思いました:

@projects.group_by(&:client).to_json

to_jsonメソッドがクライアントで.to_jsonを呼び出さないことを除いて、そのALMOSTは機能します。したがって、クライアントの場合、JSONでこれを取得します。

"#<Client:0x1051d4fb0>":[{ "project":{"name":"My Only Project", "client_id":1}}]

しかし、私は本当にこのようにそれが必要です:

{"client":{"name":"Home Workers Unite", "id":1, "projects":[{"name":"My Only Project","client_id":1}]}}

どんな助けでも大歓迎です!

4

3 に答える 3

3

@LarryKによってすでに言われているように、出力として必要なjsonは有効なjsonではありません。jsonでは、キーとしてオブジェクトを持つことができるrubyとは異なり、キーは文字列のみにすることができます。また、jsonの応答は次のようになることをお勧めします。

{clients: [
    {
      "name":"Home Workers Unite", 
      "id":1,
      "projects": [
        {"name":"My First Project", "id":1},
        {"name":"My Second Project", "id":2}
      ]
    }
  ]
}

すでに利用可能なプロジェクトがあります。それらをクライアントごとにグループ化するコードもありますがto_json、結果のハッシュを単純化することはここでは適切ではありません。直接使用できるようにするには、グループ化された応答をさらに操作する必要がありますto_json

results = {clients: []}
@projects.group_by(&:client).each do |client, projects|
  results[:clients] << {
    id: client.id,
    name: client.name
    projects: projects
  } 
end
results.to_json

これは、ソリューションのRuby/Railsバージョンです。ただし、jsonの重いアプリケーションを使用している場合は、gem(jbuilderrabl、またはその他)を使用して目的の応答を作成することをお勧めします。

PS:コードはテストされていません

于 2012-05-31T18:00:32.523 に答える
1

gemacts_as_apiをご覧になることをお勧めします。オブジェクトをJSONとして操作するのが非常に簡単になります。

于 2012-05-31T17:09:22.447 に答える
0

プロジェクトの配列のプロパティ名がないため、元の投稿のjsonは有効なjsonではありません。

Murifoxからのacts_as_apiの提案とrailscastsからの他のAPIテクニックを調べてください。彼は最近1つだけ実行しました。

APIユーザーが一度に1つのクライアントのみを必要とする場合は、次のようなjson構造を使用できます。

{client: {"name":"Home Workers Unite", "id":1},
 projects: [
      {"name":"My Only Project", "client_id":1}
           ]
}

または、必要なクライアントおよびプロジェクト情報のサブセット(またはすべて)を送信できます。

{clients: [
   {"name":"Home Workers Unite", "id":1},
   {"name":"Factory Workers Unite", "id":2},
          ],
 projects: [
      {"name":"My Only Project", "client_id":1},
      {"name":"Project 2", "client_id":2},
      {"name":"Project 3", "client_id":2}
           ]
}

利点:サーバーからAPIクライアントへのラウンドトリップが少なくなります。

于 2012-05-31T17:18:10.357 に答える