2014-10-20 2 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 
    

    그리고 단지 팀에 대한 정보를 돌려 준다. 그것은 불가능 경우

    -id 
    -name 
    -players 
        -player 
        -player 
    
  2. 은 어떻게 하나 JSON으로 두 쿼리에서 모든 정보를 병합 할 수 있습니다 : 나는 같은 JSON을 원한다.

답변

2

당신은 "join는"팀 정보 팀에서 선수를 통합하기 위해 쓸 수 있습니다. 이 시점에서 JSON을 만드는 데 필요한 정보가있는 구조를 갖게됩니다. 자세한 내용은 활성 레코드 설명서에서 "12 Joining Tables"을 참조하십시오.

두 가지 별도의 쿼리를 만든 다음 조금 더 복잡한 JSON 해시 또는 배열을 만들어 두 개의 데이터 집합을 하나의 큰 직렬화 된 개체로 출력 할 수 있습니다. 예를 들어 : 그것은 필요는 없습니다, 당신이시나를 사용하고 있기 때문에,

data = '{"team":{"name":"bears"},"players":{"1":"fred","2":"joe"}}' 
JSON[data] 
# => {"team"=>{"name"=>"bears"}, "players"=>{"1"=>"fred", "2"=>"joe"}} 

또한 다음은 데이터가 루비 오브젝트로 반환의

{"team":{"name":"bears"},"players":{"1":"fred","2":"joe"}} 

: 여기

require 'json' 

team = { 
    'name' => 'bears' 
} 

players = { 
    '1' => 'fred', 
    '2' => 'joe' 
} 

puts ({ 
    'team' => team, 
    'players' => players 
    }).to_json 

출력의 활성 레코드를 사용합니다. Sequel은 ORM이 매우 좋으며 Sinatra와 작업 할 때 가장 좋아하는 항목입니다. 함께 일하는 것이 더 쉬울 수도 있습니다.

+0

먼저 구성 할 수있는 좋은 연습의 경우, 편집 주셔서 감사합니다. 둘째, 조인을 사용하려고했지만 JSON에서 모든 정보를 가져올 수 없으므로 두 번째 옵션 (2 개 쿼리)을 사용합니다. Sequel 또는 DataMapper가 ActiveRecord보다 더 쉽지만 Rails를 필요에 따라 전환하여 ActiveRecord로 작업을 시작하는 것을 선호합니다. 다시 한 번 감사드립니다. – Filowk

2

수동 직렬화에 대한 또 다른 옵션은 객체 간의 관계를 정의하고 직렬화 할 때 포함 할 항목, 필터링 대상 및 미리로드 할 관련 객체를보다 세밀하게 선택할 수있는 ActiveModel::Serializer을 사용하는 것입니다. 대안으로 꽤 좋은 API를 가지고있는 Rabl 일 수도 있습니다.

그냥이 과잉 될 수 JSON 소량의 주위를 연주하지만, 좀 더 모든

+0

나는 Rabl을 빨리 살펴볼 것이다. 고맙습니다 – Filowk

관련 문제