如何使用ransack排序包含相关模型计数的列

时间:2018-10-08 11:05:38

标签: ruby-on-rails ransack

我有两个模型:InStockVariant

class InStock < ApplicationRecord
  has_many :variants
end

和:

class Variant < ApplicationRecord
  belongs_to :in_stock
end

在in_stocks索引页面上,我有一个带有列的表:<%= 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>

但是排序不起作用。它不会给我任何错误,什么也不会发生。有什么方法可以使此类数据处理得更厉害吗?谢谢你。

2 个答案:

答案 0 :(得分:3)

将此添加到InStock

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

答案 1 :(得分:0)

您应该使用 Rails counter_cachethis Ransack issue

中推荐的内容

在您的情况下,将 variants_count 列添加到 in_stocks 表,并将 counter_cache: true 添加到 belongs_to 中的 Variant 关系,例如:< /p>

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

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

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