2013-03-25 1 views
3

if/then 의미 정렬 순서를 사용하여 정렬 할 수있는 방법이 있는지 궁금합니다. Sunspot의 데이터에 따라 조건부 order_by

내가 ADRESS에 노력하고 기본적인 요구 사항

은 이것이다 :

  • 내 기록 nil 될 수 contact_again_time 시간 속성을 가지고있다.
  • 목록은 contact_again_time이있는 모든 레코드가 먼저 contact_again_time에 의해 오름차순 정렬되는 방식으로 정렬되어야합니다.
  • 나머지는 contact_again_time이 nil 인 경우 created_at에 의해 오름차순으로 정렬되어야합니다.

그래서 내 머리 위로 떨어져이 같은 내 searchable 모습함으로써 인덱스에 순서 필드를 구체화하여이를 해결할 수 :

integer :sort_key do                                    
    contact_again_time.nil? ? (created_at.to_i * -1) : contact_again_time.to_i                      
end 

를 그리고 내가 원하는 것을 얻기 위해 order_by(:sort_key, :desc)을 . 하지만 이런 식으로 정렬 논리의 일부를 내 모델 내부에두고 더 중요한 것은 Lucene 인덱스 안에 넣고 있습니다.

다소 오히려 잘못된 것처럼 느껴지 겠지요. contact_again_time가있을 때마다 sort=contact_again_time desc,created_at asc

, 그것은 내림차순으로 정렬 할 것이다 (그리고 관계를 깰 created_at를 사용하여, 당신에게 무관) :

답변

2

SOLR에서, 당신은 당신의 쿼리에 sort 매개 변수를 추가하여이 작업을 수행 할 수 있습니다 . created_at 만있는 경우 오름차순으로 정렬됩니다.

이것은 태양 흑점으로 곧바로 변환되어야합니다.

업데이트 : 당신이 sort=contact_again_time asc,created_at asc처럼 정렬 할 경우 당신은 당신이 아래 코멘트에 언급처럼 contact_again_time가 먼저 누락 된 문서를 얻을 것이다. 이 문서를 끝까지 밀어 넣으려면 Solst schema.xml에 을 contact_again_time에 추가하십시오. created_at도 일부 문서에없는 경우 동일한 동작을 원할 경우 sortMissingLast도 추가해야합니다.

+0

이 질문에 대한 답변을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. –

+0

답변을 업데이트했습니다. – arun

+0

나는 그것이 정확히 내가 찾고있는 대답이라고 말할 것이다. 방금 만난 문제는 이제 첫 번째 필드를 오름차순으로 정렬해야하므로이 경우에는 아무 값도 정렬되지 않으므로 다음과 같은 목적을 달성하지 못합니다. ( – Tigraine