2016-06-23 18 views
2

我想弄清楚如何通过我的模型上的方法对返回整数进行排序。搜索按返回整数的模型方法排序

class Business < ActiveRecord::Base 

    has_many :questions 

    def questions_count 
    questions.count 
    end 
end 

我希望能够通过我的表中的questions_count方法使用ransack进行排序。

我试过<th><%= sort_link @q, :questions_count %></th>没有运气。

这甚至可能吗?我怎样才能实现它?

回答

2

sort_link帮助器方法只能接受属性或关联的属性,但如果希望简单地返回关联记录的数量,这可以使用现有的轨道机制。

实现此目的的最简单方法是使用counter_cache - 一种用于统计属于关联模型的对象数量的方法。你必须在这个业务模式添加到关联像这样:

has_many :questions, counter_cache: true 

它也需要在业务表叫questions_count数据库列,但是,你其实可以自定义这个名字(这是什么使您能够将问题的数量传递给sort_link方法)。

一旦设置完成,您应该可以调用sort_link helper方法而不会出现问题。

sort_link @q, :questions_count 

查找更多about counter_cache here

或者,有另一种方法来实现这一点。您可以定义一个ransacker。您可以使用它来显式编写一条SQL语句,该语句可以针对业务的所有相关问题执行COUNT函数,但我认为它不如counter_cache方法更方便。主要是因为SQL语句会重新定义/替换questions_count方法的功能。

查找有关reackackers here的更多信息。

0

是的,你可以使用类似@collection.sort_by{|item| item.method_name}的东西排序。只需使用您想要分类的方法替换“@collection”和您想要分类的方法替换“method_name”

+0

虽然没有使用搜索引擎,但是... – Deekor

+0

@collection是您的搜索结果。类似于Model.search(params).sort_by {| item | item.method_name} –

+0

但是每次都会排序,我只希望它在排序链接被点击时排序。 – Deekor