按 returns 整数的模型方法搜索排序

ransack sort by model method that returns an integer

我正在尝试弄清楚如何在我的模型上通过 returns 整数的方法进行排序。

class Business < ActiveRecord::Base

  has_many :questions

  def questions_count
    questions.count
  end
end

我希望能够在 table 中使用 ransack 按 questions_count 方法进行排序。

我试过 <th><%= sort_link @q, :questions_count %></th> 但没有成功。

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

是的,您可以使用 @collection.sort_by{|item| item.method_name} 之类的方法进行排序。只需将“@collection”替换为您的项目集,并将 "method_name" 替换为您想要排序的方法

sort_link辅助方法只能接受一个属性或一个关联的属性,但是如果你想简单return一个关联记录的计数,这可以使用一个现有的rails机制。

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

has_many :questions, counter_cache: true

它还需要在业务 table 中有一个名为 questions_count 的数据库列,但是,您实际上可以自定义它的名称(这将使您能够传递问题的数量sort_link 方法)。

设置完成后,您应该可以毫无问题地调用 sort_link 辅助方法。

sort_link @q, :questions_count

进一步了解 counter_cache here

或者,有 'another' 方法可以实现此目的。您可以改为定义 ransacker。您可以使用它来显式编写一个 SQL 语句,该语句可以对业务的所有关联问题执行 COUNT 函数,但我认为它不如 counter_cache 方法方便。主要是因为 SQL 语句会 redefine/replace questions_count 方法功能。

了解更多关于掠夺者的信息 here