我有两个模型:InStock
和Variant
:
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>
但是排序不起作用。它不会给我任何错误,什么也不会发生。有什么方法可以使此类数据处理得更厉害吗?谢谢你。
答案 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_cache
。 this 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>