2012-07-10 4 views
1

다음과 같은 관계가 있습니다. 공급 업체 이름, 클라이언트 이름, INV 아니, INV 트란 날짜 및 식사 정렬 순서하지만 마지막 송장 거래를 통해 :레일즈 액티브 레코드 다중 조인을 통한 주문

AdhocBkg 
    has_many :invoice_trans 
InvoiceTran 
    belongs_to :invoice_hdr 
    belongs_to :meal 
InvoiceHdr 
    belongs_to :supplier 
    belongs_to :client  

은 내가 '청구'상태로 모든 AdhocBkgs를 꺼내 다음 기준으로 정렬 할 필요가 각 AdhocBkg.

#AdhocBkg Billed Status ID 
abbilledstatusid = AdhocBkgStatus.find_by_abstatdesc('Billed').id 
@adhocbkgs = AdhocBkg.find_all_by_abstatusid(abbilledstatusid) 
@adhocbkgs.sort! {|x,y| x.invoice_trans.last.invoice_hdr.supplier.suppname + x.invoice_trans.last.invoice_hdr.client.clientname + x.invoice_trans.last.invoice_hdr.invno.to_s + x.invoice_trans.last.invtrndate.strftime('%Y%m%d') + x.invoice_trans.last.meal.mealsortseq.to_s <=> y.invoice_trans.last.invoice_hdr.supplier.suppname + y.invoice_trans.last.invoice_hdr.client.clientname + y.invoice_trans.last.invoice_hdr.invno.to_s + y.invoice_trans.last.invtrndate.strftime('%Y%m%d') + y.invoice_trans.last.meal.mealsortseq.to_s } 

위의 작동하지만 여러 데이터베이스에 대한 읽기 때문에 크게 매우 느린 내가 실제 종류를 의심 :

내 현재 코드입니다. 나는 코드를 :include 또는 :joins:order 절을 사용하여 코드를 리팩토링 할 수 있었는지 궁금해서이 작업을 가속화하는 데 도움이 될 수 있습니다. 그러나 레일즈 액티브 레코드 '찾기'문이 위의 내용에 맞는지 확인해 낼 수는 없습니다.

저는 Rails 3.2.1, Ruby 1.9.3p0 및 MySQL 5.1을 Ubuntu 11.04에서 사용하고 있습니다.

답변

3

마지막 거래 란 무엇입니까? 그것은 최대 ID (귀하의 코드를보고, 그것이있는 것처럼 보입니다), 또는 최신 업데이트 된 타임 스탬프를 가진 사람입니까? 나는 당신이 원하는 것처럼 정확하게 작동 확신하지이 테스트를하지 않은

AdHocBkg.joins(:adhoc_bkg_status, :invoice_trans => [ :meal, { :invoice_hdr => [ :supplier, :client ] } ]). 
    where("adhoc_bkg_statuses.abstatdesc='Billed' and invoice_trans.id = (select max(id) from invoice_trans as it where it.ad_hoc_bkg_id=ad_hoc_bkgs.id)"). 
    order("suppliers.suppname desc, clients.clientname desc, invoice_hdrs.invno desc, invoice_trans.invtrndate, meals.mealsortseq desc") 

,하지만 당신은 아마이에서 시작할 수 있습니다

의이 파악 해보자. 당신은 당신이 정렬 된 필드에 액세스하려는 경우

편집

당신은 includes 대신 joins의를 사용하여 시도 할 수 있습니다.

+0

굉장한 것처럼 보입니다. 나는 내일 아침에 시험해보고 결과를 알려줄거야. 고마워. 작동하지 않더라도 중첩 된 조인을 수행하는 방법을 배웠습니다. 그 값어치가 금으로 가치가 있습니다. 그런데 마지막 거래가 최대 ID를 가진 거래입니다. Purvez – nexar

+0

환상적이었습니다 !! 주로 테이블의 철자법 인 사소한 변경을해야했지만 다른 사용자를 던질 수있는 유일한 것은 'where'절이 었습니다. invoice_trans.id = (invoice_trans에서 max (id)를 선택하십시오. invoice_trans.id = (invoice_trans에서 max (id)를 선택하십시오. 항목을 강조하기 위해 대문자로 'AS'를 넣었지만 물론 소문자 여야합니다. 주요한 것은 이전 코드에서 리턴하는 데 약 50 초가 걸렸습니다. 결과 .5 초 미만입니다 !! 결과! 감사합니다. – nexar

+0

감사를 정정했습니다. 감사합니다. – HargrimmTheBleak