2013-08-18 76 views
2

我有一個Product模型,其中有namedescription列在數據庫中。導軌4按虛擬屬性排序

我也有一個Product.search_results_for(query),其中query是一個像"Green Apple"字符串。

我需要返回一個ActiveRecord::Relation的結果排序是最好的命中。目前,我正在爲每個產品設置search_result_valuesearch_result_value不是數據庫中的列,我不希望它是。

所以在本質上,我有ProductsActiveRecord::Relation我需要通過search_result_value沒有它改變到一個數組,這是沒有存儲在數據庫中的實例變量訂購。我怎樣才能做到這一點?

事情是這樣的:

Product.order(:search_result_value) 
+2

「search_result_value」計算有多複雜?您可以對可以在SQL中表達的任何表達式進行ORDER BY。 –

回答

6

如果你不把價值一列或表達的邏輯search_result_value純SQL,那麼你就必須對所有產品加載到內存中,然後對它們進行排序在Ruby中使用sort_by

Product.all.to_a.sort_by(&:search_result_value) 
+1

謝謝,但有沒有任何方法做到這一點,而無需將其轉換爲數組?如在中,通過各個對象的實例變量對ActiveRecord :: Relation進行排序? – Mavvie

+0

這裏,''to_a''調用不是必須的。現在活動記錄關係被延遲加載,因此在活動記錄關係中調用''sort_by''會隱式地將其轉換爲數組,然後調用''sort_by''。 – Intrepidd

+1

@Mavvie,ActiveRecord :: Relation只是一個查詢,而不是結果集。因此,您可以編寫SQL來爲您計算字段,或者您需要將記錄拉入數組中並使用Ruby進行排序。 – cpuguy83