返回数据库结果相同的JSON父级和子级

时间:2014-10-20 13:58:24

标签: ruby json activerecord sinatra

我有团队和玩家类,想要在一个包含团队信息的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
  1. 如何在同一查询中查询有关团队和玩家的信息。我试过了:

    @team = Team.includes(:players).where(players: {team_id: Team.last}).last.to_json
    

    它只返回有关团队的信息。我想要一个JSON,如:

    -id
    -name
    -players
        -player
        -player
    
  2. 如果不可能,我如何将两个查询中的所有信息合并为一个JSON。

2 个答案:

答案 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,这可能会有点矫枉过正,但要想更有条理,这是一个很好的做法