2013-03-25 82 views
3

我想知道是否有一種方法可以使用排序順序的某種if/then語義進行排序。有條件的order_by取決於太陽黑子中的數據

我想ADRESS的基本要求是:

  • 我的記錄,有可能是一個nil時間contact_again_time屬性。
  • 該列表應按照以下方式排序:確實有contact_again_time的所有記錄首先按contact_again_time降序排列。
  • 其中contact_again_time爲零的其餘位置應按照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索引中。

我寧可避免,因爲它感覺錯了。 sort=contact_again_time desc,created_at asc

每當contact_again_time存在,它會按降序進行排序(並使用created_at打破平局,這是無關緊要的給你):

回答

2

Solr中,您可以通過添加sort參數查詢做到這一點。當僅存在created_at時,這些將按升序排序。

這應該直接轉化爲太陽黑子。

更新:如果你想有點像sort=contact_again_time asc,created_at asc你會得到其中contact_again_time首先丟失,就像你在下面的評論提及的文件。要將這些文檔推到最後,請在您的Solr schema.xml中添加sortMissingLast="true"contact_again_time。如果created_at在某些文檔中也可能不存在,並且您希望獲得相同的行爲,則您也應該添加sortMissingLast

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – 2013-03-26 02:20:49

+0

我已經更新了答案。 – arun 2013-03-26 04:45:47

+0

我會說這幾乎就是我正在尋找的答案。我遇到的唯一問題是我現在需要按升序對第一個字段進行排序,所以在這種情況下,nil值會被排序,這會破壞:( – Tigraine 2013-03-26 09:50:24