Ruby on rails Rails:对来自不同模型的对象进行排序

Ruby on rails Rails:对来自不同模型的对象进行排序,ruby-on-rails,sorting,Ruby On Rails,Sorting,我用两种不同的模型填充了一个散列。然后,我尝试按如下方式对它们进行分类: @search_results = User.find(:all, :conditions => ['name LIKE ?', "%#{params[:query]}%"]) @search_results += Book.find(:all, :conditions => ['title LIKE ?', "%#{params[:query]}%"]) @search_results.sort! { |a,

我用两种不同的模型填充了一个散列。然后,我尝试按如下方式对它们进行分类:

@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 }

用户和书籍都有一个基于整数的单位计数。为什么不能通过此属性进行排序?我还有其他选择吗?

我最近遇到了类似的问题,最后编写了一些自定义sql,因为所有其他方法都返回了一个数组。可以肯定的是,使用sort方法不是一个好主意,因为使用SQL进行排序总是比使用ruby更有效,尤其是当数据集变得很大时

  @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]])

上面的代码完全没有经过测试,更像是一个示例,我最近遇到了一个类似的问题,最后编写了一些自定义sql,因为所有其他方法都返回了一个数组。可以肯定的是,使用sort方法不是一个好主意,因为使用SQL进行排序总是比使用ruby更有效,尤其是当数据集变得很大时

  @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]])

上面的代码完全未经测试,更像是一个示例

在修补了一些之后,我几乎可以让它工作了。我希望如此。唯一的问题是它传递的是nil值。这可能是什么原因造成的?我怀疑它与_book的某个_属性_有关,尽管我不确定该放置什么位置。_book的某个_属性_只是一个示例,说明了如果字段不在另一个模型中,如何将其检索为NULL。因为两个表中都必须有一个字段,联合才能工作。因此,如果您不需要这样的内容,可以将其删除,否则替换为要从books表中提取的任何字段,反之亦然。希望helpsI不再得到nil结果,但是hash仍然是空的。即使我将其精简为:User.find_by_-sql[从用户中选择name-WHERE-name-LIKE?,params[:query]]啊,现在我知道发生了什么。通常,我可以通过只传递查询的一部分来获得结果,例如返回死亡之书和乔治之书。现在我已经输入了it工作的完整搜索查询。我不知道为什么会发生这种情况,因为我还在使用LIKE。我会调查一下,告诉你我发现了什么,明白了。我需要将params[:query]替换为%{params[:query]}%。不管怎样,它现在工作得很好。谢谢你的帮助,乔恩!在修补了一些之后,我几乎让它工作了。我希望如此。唯一的问题是它传递的是nil值。这可能是什么原因造成的?我怀疑它与_book的某个_属性_有关,尽管我不确定该放置什么位置。_book的某个_属性_只是一个示例,说明了如果字段不在另一个模型中,如何将其检索为NULL。因为两个表中都必须有一个字段,联合才能工作。因此,如果您不需要这样的内容,可以将其删除,否则替换为要从books表中提取的任何字段,反之亦然。希望helpsI不再得到nil结果,但是hash仍然是空的。即使我将其精简为:User.find_by_-sql[从用户中选择name-WHERE-name-LIKE?,params[:query]]啊,现在我知道发生了什么。通常,我可以通过只传递查询的一部分来获得结果,例如返回死亡之书和乔治之书。现在我已经输入了it工作的完整搜索查询。我不知道为什么会发生这种情况,因为我还在使用LIKE。我会调查一下,告诉你我发现了什么,明白了。我需要将params[:query]替换为%{params[:query]}%。不管怎样,它现在工作得很好。谢谢你的帮助,乔恩!