如何对包含关联模型计数的列进行排序
How can I sort with ransack a column that contains count of the associated model
我有两个模型:InStock
和 Variant
:
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>
我有两个模型:InStock
和 Variant
:
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>