Ruby on rails Rails 4按虚拟属性排序

Ruby on rails Rails 4按虚拟属性排序,ruby-on-rails,ruby,activerecord,ruby-on-rails-4,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 4,我有一个产品模型,它在数据库中有名称和描述列 我还有一个产品。搜索(查询)的结果,其中query是一个类似“绿苹果”的字符串 我需要返回一个结果的ActiveRecord::Relation,该结果按哪个是最佳命中率排序。目前,我正在为每个产品设置一个search\u result\u值搜索结果\u值不是数据库中的一列,我不希望它是 因此,本质上,我有一个ActiveRecord::Relation的Products,我需要通过search\u result\u value排序,而不需要将其更改

我有一个
产品
模型,它在数据库中有
名称
描述

我还有一个
产品。搜索(查询)
的结果,其中
query
是一个类似
“绿苹果”
的字符串

我需要返回一个结果的
ActiveRecord::Relation
,该结果按哪个是最佳命中率排序。目前,我正在为每个产品设置一个
search\u result\u值<代码>搜索结果\u值
不是数据库中的一列,我不希望它是

因此,本质上,我有一个
ActiveRecord::Relation
Products
,我需要通过
search\u result\u value
排序,而不需要将其更改为数组,数组是数据库中未存储的实例变量。我该怎么做

大概是这样的:

Product.order(:search_result_value)

如果您没有将值放入列中,也没有用纯SQL在
search\u result\u value
中表达逻辑,那么您必须将所有产品加载到内存中,然后使用以下命令在Ruby中对它们进行排序:


搜索结果值的计算有多复杂?您可以按任何可以在SQL中表达的表达式进行排序。谢谢,但是有没有方法不将其转换为数组就可以进行排序?与中一样,按相应对象的实例变量对ActiveRecord::Relation进行排序?在这里,不需要调用
to_a
。现在活动记录关系是延迟加载的,因此对活动记录关系调用
sort\u by
将隐含地将其转换为数组,然后对其调用
sort\u by
。@Mavvie,ActiveRecord::relation只是一个查询,而不是结果集。因此,您可以编写SQL来计算字段,或者您需要将记录拉入数组并使用Ruby对其进行排序。@Intrepidd,我知道不需要它,但我认为它更清楚,特别是因为
all
过去是一个数组,但现在是从Rails 4开始的关系。没有@Mavvie,数据库不知道你的Ruby存在,实例变量也不存在,直到你将对象加载到Ruby-land中。谢谢,很抱歉忘记了这个评论。我从来没有实现过它(事实上,我想通过ruby虚拟属性来实现SQL order(),这毫无意义。lol。我现在正在使用它,自从我去年开始使用它以来,它已经走了很长的路。
Product.all.to_a.sort_by(&:search_result_value)