2016-09-14 5 views
0

의 마지막 기록의 열을 기반으로 액티브 관계를 주문합니다.
c1은 1 사례이고 c2는 2 사례입니다.
어떻게 아래로 두 모델을 가지고 관련 객체

c1 = Client.create(name: 'C1') 
c2 = Client.create(name: 'C2') 
case1 = Case.create(type: 'Normal', client: c1) 
case2 = Case.create(type: 'Normal', client: c2) 
case3 = Case.create(type: 'High', client: c2) 

나는 각 클라이언트 오름차순/내림차순의 마지막 경우의 유형에 따라 모든 클라이언트 및 순서를 싶어. 내가 오름차순으로 주문하면 결과가 'c1'이고 그 다음에 c2가 있어야합니다. desc로 주문하면 'c2', 'c1'의 결과를 가져야합니다. 다음은 지금까지 시도한 것입니다. C2를도 '정상'타입의 케이스를 가지고 있기 때문에

Client.includes(:cases).order('cases.type asc') # => 'C2,C1' 
Client.includes(:cases).order('cases.type desc') # => 'C2,C1' 

, 나는 쿼리가 다음이 client.cases 같은 일을 할, 첫 번째 클라이언트를 찾는 것 같다 생각합니다. 그렇다면 각 고객의 경우에만 주문을한다고 생각하며 고객을 통해 사례를 주문하지 않습니다.
내 설명이 약간 혼란 스럽다고 생각합니다. 당신이 가진다면 나에게 질문을 남겨주세요. 감사.

+0

빈 데이터베이스로 예제를 사용해 보셨습니까? 레일 4와 함께 작동한다고 생각합니다. 동일한 '유형'을 가진 레코드의 순서가 정의되어 있지 않기 때문에 두 경우 모두 c2, c1로 돌아갈 수 있습니다. STI에'type'을 사용합니까? STI보다 다른 목적으로'type'이라는 이름의 컬럼을 사용하면 원하지 않는 부작용이 생길 수 있습니다. – slowjack2k

+0

Thanks @ slowjack2k 님의 의견입니다. 이전에 저의 실수였던 결과물을 업데이트했습니다. 어쨌든, 내 문제는 내가 오름차순이나 내림차순 중 하나를 주문한다는 것인데 결과는 같습니다. 반면 컬럼 이름으로 'type'을 사용하여 부작용을 언급 해 주셔서 감사합니다. 사실, 내 열 이름은 'case_type'이지만 예제로 type을 말하면서 그 점을 잊어 버렸다. 어쨌든 STI 용으로 사용하지는 않습니다. –

답변

0

테이블에서 열 유형을 사용할 수 없기 때문에 'type'대신 'case_type'열을 변경했습니다.

클라이언트 사례의 마지막 레코드의 사례 유형별로 데이터를 정렬하려면 다음을 시도하십시오.

has_many :cases, -> { order 'type asc' } 

이 방법의 경우 항상 것입니다 : A는이 같은 많은 연관을 가지고 있기 DESC

를 들어 ASC

Client.includes(:cases).sort_by{|m| m.cases.last.case_type} 

를 들어

Client.includes(:cases).sort_by{|m| m.cases.last.case_type}.reverse 
+0

답장을 보내 주신 고맙습니다. 실제로, 나는 당신의 선택과 같이 시도했지만, 어떤 고객에게는 전혀 사례가 없을 때 오류가 발생합니다. 이 문제를 해결할 수있는 아이디어가 있습니까? –

+0

Client.all.sort_by {| m | m.cases.present? ? m.cases.last.case_type : "ZZZ"} –

0

당신은 기본 ordcer을 설정할 수 있습니다 순서대로 돌아 오라. 모든 일이 잘 작동 나의 관점에서

Client.includes(:cases).sort_by { |c| c.cases.last.type } 
+0

답장을 위해 @Joe에게 감사드립니다. 사실, 나는 두 번째 옵션을 시도했지만 일부 고객에게는 전혀 사례가없는 경우 오류가 발생합니다. 이 문제를 해결할 수있는 아이디어가 있습니까? –

0

: 그래서 당신은, 예를 지난 경우에 호출 설정에 클라이언트에서 사용자 지정 정렬을 sort_by를 사용 (그리고 경우가 정렬됩니다 것을 확신 할) 수있다. 주문 명세서는 type 또는 case_type의 주문 만 보장합니다. type 당신이 지정하지 않은 동일 할 때 데이터베이스는 어떻게해야합니까

Normal, C1 
Normal, C2 
High, C2 

또는

Normal, C2 
Normal, C1 
High, C2 

cases.type asc

에 대한 반환 할 수 있습니다. Rails는 데이터베이스가 레코드를 리턴하는 순서로 오브젝트를 리턴합니다.다른 순서 당신을 wan't 경우

, 당신은 예를 들어, 순서를 지정해야합니다 :

Client.includes(:cases).order('cases.type asc, clients.name asc') 

편집 :

당신이 사용할 수 있습니다 마지막 depentend 기록에만 주문하려면 subselect :

Client.select('(SELECT cases.type from cases where cases.client_id=clients.id ORDER BY cases.id desc LIMIT 1) as case_type_name, *').order('case_type_name asc')