2014-10-20 57 views
1

我有團隊和球員類,並希望返回一個包含團隊信息的JSON字符串中的數據,但同時它顯示關於球員的所有信息。返回數據庫結果在相同的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

您可以編寫一個「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"}} 

此外,由於您使用的西納特拉,它沒有必要使用Active Record。 Sequel是一個非常好的ORM,是我在Sinatra工作時最喜歡的。您可能會發現與其合作更容易。

+0

首先,感謝你的編輯。其次,我嘗試使用連接,但無法獲取JSON中的所有信息,因此我將使用第二個選項(2個查詢)。 我知道Sequel或DataMapper比ActiveRecord更容易,但我希望儘快切換Rails,因此我更願意使用ActiveRecord。 再次感謝您。 – Filowk 2014-10-20 15:22:10

2

手動序列化的另一種選擇是使用ActiveModel::Serializer,它允許您定義對象之間的關係,併爲您提供更精細的選擇,包括序列化時要包含的內容,要過濾的內容以及要預加載的相關對象。另一種選擇也可以是Rabl,它也具有相當不錯的API。

如果你只是使用JSON少量,這可能是矯枉過正玩耍,但它是一個很好的做法,更加有組織的

+0

我會快速瀏覽一下Rabl。謝謝 – Filowk 2014-10-20 21:34:30