【问题标题】:ransack sort by model method that returns an integerransack 按返回整数的模型方法排序
【发布时间】:2016-06-23 16:35:50
【问题描述】:

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

class Business < ActiveRecord::Base

  has_many :questions

  def questions_count
    questions.count
  end
end

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

我试过&lt;th&gt;&lt;%= sort_link @q, :questions_count %&gt;&lt;/th&gt;,但没有成功。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    has_many :questions, counter_cache: true
    

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

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

    sort_link @q, :questions_count
    

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

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

    了解更多关于洗劫者here

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • @collection 是您搜查的结果。类似 Model.search(params).sort_by{|item| item.method_name}
      • 但是每次都会排序,我只希望它在单击排序链接时进行排序。
      • 我一直在试一试,但似乎也没有对其进行排序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      相关资源
      最近更新 更多