2012-07-17 69 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

相关问题