2011-12-16 2 views
2

-3.1 연습 :최저 레일을 감안할 때 복잡한 쿼리

(모델) : 예를 들어

Contract (has_many :invoices, belongs_to :user) 
Invoice (belongs_to :contract) 

이 방법 :이 경우

my_contracts = Contract.where(user_id: current_user.id) #=> [#<Contract id: 1, title: "1">, #<Contract id: 2, title: "2">] 

우리는 사용자에 대한 두 가지 계약이있다. 각 계약서에는 여러 개의 송장이 있습니다.

이제 계약서별로 모든 인보이스를 수집하고 'updated_at'별로 정렬해야합니다. 다음과 같음 :

all_invoices = my_contracts.map{|i| i.invoices.sort_by(&:updated_at)} 

그러나 ActiveRecord를 사용합니다.

어떻게 제대로 할 수 있습니까?

Invoice.joins(:contracts).where(user_id: current_user.id).order(:updated_at) 

Arel 같은

답변

0

그것은해야 뭔가 내 강력한 슈트 (여전히 작업 필요)가 아니라 문제가 해결되지 않을 경우, 적어도 가까이에 당신을 얻을합니다 대답.

+0

확실하지 않은 볼 수 있지만 '계약 및 송장 테이블에 있기 때문에 updated_at에 모호한 오류가 발생할 수 있습니까? '.order ("invoices.updated_at")'가 필요할 수도 있습니다. – house9

+0

사실입니다. 'Invoice.joins (: contracts) .where (user_id : current_user.id) .order (: updated_at) .to_sql'을 사용하여 레일스 콘솔에서 이것을 시도해보고 생성 된 SQL을 확인하는 것이 가장 좋습니다. (그리고 자연스럽게 모든 것을 검사하는 테스트 케이스가 있어야한다 ;-)) –

1
당신이 그것을하고있는 방법은 나쁘지 않다

, 단지 사용 (N + 1)로드

contracts = Contract.where(:user_id => current_user.id).includes(:invoices) 
# or this might do the same => current_user.contracts.includes(:invoices) 
invoices = contracts.map{|i| i.invoices } 

invoices.sort_by(&:updated_at).each do |invoice| 
    # .... 
end 

, 데이비드 Sulc 게시 또한 무엇을보기를이 시도하고 게으른 대신 송장의 열망로드를 얻을 포함 생성 된 SQL과 실험 결과로 레일 콘솔; (: updated_at) 조인 대 포함 사용하는 다른

것보다 어쩌면 더 나은 상황 중 하나에 따라 아주 다른 행동을 가지고는 .order`도