我有团队和玩家类,想要在一个包含团队信息的JSON字符串中返回数据,但同时显示有关玩家的所有信息。
class Team < ActiveRecord::Base
has_many :players
end
class Players < ActiveRecord::Base
belongs_to :team
end
我知道如何检索有关团队和玩家的信息,但不知道在同一查询中。另一个问题是我不知道如何在一个JSON中合并结果JSON。
team = Team.last.to_json
player = team.players.to_json
如何在同一查询中查询有关团队和玩家的信息。我试过了:
@team = Team.includes(:players).where(players: {team_id: Team.last}).last.to_json
它只返回有关团队的信息。我想要一个JSON,如:
-id
-name
-players
-player
-player
如果不可能,我如何将两个查询中的所有信息合并为一个JSON。
答案 0 :(得分:2)
您可以编写一个“join”,将团队中的玩家与团队信息合并。此时,您将拥有一个具有创建JSON所需信息的结构。有关详细信息,请参阅Active Record文档中的“12 Joining Tables”。
或者,您可以进行两个单独的查询,然后创建一个更复杂的JSON哈希或数组,允许您将两组数据输出到一个更大的序列化对象中。例如:
require 'json'
team = {
'name' => 'bears'
}
players = {
'1' => 'fred',
'2' => 'joe'
}
puts ({
'team' => team,
'players' => players
}).to_json
这是输出:
{"team":{"name":"bears"},"players":{"1":"fred","2":"joe"}}
这是返回Ruby对象的数据:
data = '{"team":{"name":"bears"},"players":{"1":"fred","2":"joe"}}'
JSON[data]
# => {"team"=>{"name"=>"bears"}, "players"=>{"1"=>"fred", "2"=>"joe"}}
此外,由于您使用的是Sinatra,因此无需使用Active Record。 Sequel是一个非常好的ORM,在与Sinatra合作时是我个人的最爱。您可能会发现使用起来更容易。
答案 1 :(得分:2)
手动序列化的另一个选择是使用ActiveModel::Serializer
,它允许您定义对象之间的关系,并为您提供更精细的选择,包括序列化时要包含的内容,要过滤的内容以及要预加载的相关对象。另一种选择也可以是Rabl,它也有相当不错的API。
如果你只是玩弄少量的JSON,这可能会有点矫枉过正,但要想更有条理,这是一个很好的做法