ransack按模型方法排序,返回一个整数

时间:2016-06-23 16:35:51

标签: ruby-on-rails ruby-on-rails-4 ransack

我正在试图弄清楚如何通过我的模型上的一个返回整数的方法进行排序。

class Business < ActiveRecord::Base

  has_many :questions

  def questions_count
    questions.count
  end
end

我希望能够使用ransack按照表格中的questions_count方法进行排序。

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

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

2 个答案:

答案 0 :(得分:2)

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

实现此目的的最简单方法是使用counter_cache - 一种计算属于关联模型的对象数量的方法。您必须将此添加到您的业务模型中的关联,如下所示:

has_many :questions, counter_cache: true

它还需要名为questions_count的business表中的数据库列,但是,您实际上可以自定义此名称(这将使您能够将问题数传递给sort_link方法)。

设置完成后,你应该能够毫无问题地调用sort_link助手方法。

sort_link @q, :questions_count

了解有关counter_cache here的更多信息。

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

详细了解搜索者here

答案 1 :(得分:0)

是的,您可以使用@collection.sort_by{|item| item.method_name}之类的内容进行排序。只需替换&#34; @ collection&#34;按您的项目和&#34; method_name&#34;通过您想要排序的方法