2017-04-06 3 views
0

가입하세요. 예를 들어, 하나의 주소에 3 개의 서비스 레코드가있는 경우 각 서비스 레코드의 주소 필드를 반복하면서 각 서비스 레코드의 플랜트 정보를 포함하는 3 개의 결과를 얻고 싶습니다.레일 LEFT은 검색 및 JSON 나는 다음과 같은 모델을 가지고

지금까지 내 쿼리과 같이 찾고 있습니다 (레일을 사용하여 5) :

(내 위의 예에서 즉 3) 나에게 반복 주소 결과의 정확한 수를 반환
Address.left_joins(service_records: :plant) 

.

내가 알아 내려고하는 다음 단계는 결과 쿼리를 각 주소와 각 고유 서비스 레코드가 포함 된 JSON 구조로 반환하는 것입니다. 이 같은 무언가 : 당신이 발견하는 경우

[ 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 1 
     plant: { 
     id: 1 
     } 
    } 
    }, 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 2 
     plant: { 
     id: 2 
     } 
    } 
    }, 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 3 
     plant: { 
     id: 3 
     } 
    } 
    } 
] 

, 나는 내 주소 모델에 attr_accessor :service_record을 수행하지만 나는 그게 내가 필요한 것을 얻을 수있는 올바른 방법입니다 확실하지 않다. 제가 찾고있는 것을 얻기위한 어떤 도움이나 대안적인 접근은 많은 도움이 될 것입니다!

답변

0

쿼리에서 레일즈 as_json을 옵션과 함께 사용하여 원하는 것을 얻을 수 있습니다. 당신이 뭔가를 할 수 있습니다 :

addresses.as_json(include: { service_record: { include: :plant } }) 
# => [ 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 1 
     plant: { 
     id: 1 
     } 
    } 
    }, 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 2 
     plant: { 
     id: 2 
     } 
    } 
    }, 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 3 
     plant: { 
     id: 3 
     } 
    } 
    } 
] 

당신이 할 수있는 다음 미세 조정 결과 :

addresses = Address.left_joins(service_records: :plant) 
addresses.as_json 
# => [ 
    { 
    id: 1, 
    address: "1234 Street Rd" 
    }, 
    { 
    id: 1, 
    address: "1234 Street Rd" 
    }, 
    { 
    id: 1, 
    address: "1234 Street Rd" 
    } 
] 

다음 단계는 협회

마지막으로
addresses.as_json(include: :service_record) 
[ 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 1 
    } 
    }, 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 2 
    } 
    }, 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 3 
    } 
    } 
] 

등을 포함하는 것입니다. 이것에 대한 자세한 내용은 documentation.

UPDATE

당신이 service_records 배열에 하나의 레코드 만있을 것이라는 점을 확신한다면, 당신은 할 수 :

def service_record 
    service_records.first 
end 

는이

addresses.as_json(methods: :service_record) 
[ 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 1 
    } 
    }, 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 2 
    } 
    }, 
    { 
    id: 1, 
    address: "1234 Street Rd", 
    service_record: { 
     id: 3 
    } 
    } 
] 
+0

'service_record'을 주소 모델의 "공식적인"속성이 아닙니다. 나는'service_records'에만 접근 할 수 있는데, 그 이유는 이것이 모델들 사이의 연관이기 때문입니다. –

+0

왜 service_record attr_accessor를 설정 했습니까? – Jeremie

+0

가능한 아이디어로 추가했습니다. 현재 아무 데서도 설정하지 않습니다. 쿼리 중에 주소에 조인되는 'service_record'와 동일한 값을 설정하는 방법이 있으면 좋겠지 만 그렇게 불가능한 것처럼 보입니다. –