2012-07-17 97 views
1

我已經用兩種不同模型填充了一個散列。然後,我嘗試將它們像這樣排序:Rails:對來自不同模型的對象進行排序

@search_results = User.find(:all, :conditions => ['name LIKE ?', "%#{params[:query]}%"]) 
@search_results += Book.find(:all, :conditions => ['title LIKE ?', "%#{params[:query]}%"]) 
@search_results.sort! { |a,b| a.impressions_count <=> b.impressions_count } 

這引發以下錯誤:

comparison of User with Book failed 

用戶和書有一個基於整數impressions_count。爲什麼我不能通過這個屬性排序?我還有什麼其他選擇?

回答

1

最近我遇到了一個類似的問題,最後寫了一些自定義sql,因爲所有其他方法都返回一個數組。肯定它不是一個好主意,用那種方法,因爲它總是會更有效的SQL比紅寶石進行排序,特別是當數據集上述變大

@combined_results = User.find_by_sql(["SELECT title, id, impressions_count, NULL as some_attribute_of_book 
             FROM user 
             WHERE title LIKE ? 
             UNION SELECT title, id, impressions_count, some_attribute_of_book FROM book 
             WHERE title LIKE ? 
             ORDER BY impressions_count", params[:query], params[:query]]) 

完全是未經測試的代碼更的,例子比任何東西

+0

經過這一些修補後,我幾乎有它的工作。 (我希望。)唯一的問題是它傳遞零值。什麼可能導致這種情況?我懷疑它與「some_attribute_of_book」有關,儘管我不知道該如何放置它。 – nullnullnull 2012-07-17 22:26:47

+0

some_attribute_of_book只是一個例子,說明如果它不在另一個模型中,可以將字段檢索爲NULL。由於你必須在兩個表中都有一個字段才能使聯合工作。所以,如果你不需要像這樣的東西,你可以將其刪除,否則替換爲任何你想從書桌上撤回的字段,反之亦然。希望有幫助 – 2012-07-17 22:37:34

+0

我不再得到零結果,但散列仍然是空的。即使我把它縮小到這個:User.find_by_sql([「SELECT name FROM users WHERE name LIKE?」,params [:query]]) – nullnullnull 2012-07-17 23:04:32

相關問題