按 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。
我正在尝试弄清楚如何在我的模型上通过 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。