如何对包含关联模型计数的列进行排序

How can I sort with ransack a column that contains count of the associated model

我有两个模型:InStockVariant:

class InStock < ApplicationRecord
  has_many :variants
end

和:

class Variant < ApplicationRecord
  belongs_to :in_stock
end

在 in_stocks 索引页上,我有一个 table 列: <%= in_stock.variants.count %> 我想使用 ransack gem 进行排序柱子。为此,我在控制器中有以下代码:

def index
  @q = InStock.ransack(params[:q])
  @in_stocks = @q.result.includes(:variants)
end

并且在视图中:

<th><%= sort_link(@q, :variants_count, t('admin.pages.in_stocks.variants'), default_order: :desc) %></th>

但是排序不起作用。它没有给我任何错误,只是什么也没发生。有没有什么办法可以让 ransack 处理这种数据?先谢谢了。

将此添加到 InStock class

ransacker :variants_count do
  query = '(SELECT COUNT(variants.in_stock_id) FROM variants where variants.in_stock_id = in_stocks.id GROUP BY variants.in_stock_id)'
  Arel.sql(query)
end

你应该使用 Rails counter_cache. Which is what is recommended in this Ransack issue

在您的情况下,向 in_stocks table 添加一个 variants_count 列,并向 [=17] 中的 belongs_to 关系添加一个 counter_cache: true =],例如:

class Variant < ApplicationRecord
  belongs_to :in_stock,
  counter_cache: true
end

使用此方法,您的排序 link 甚至不需要更改并保持:

<th>
  <%= sort_link(@q, :variants_count, t('admin.pages.in_stocks.variants'), default_order: :desc) %>
</th>