代码之家  ›  专栏  ›  技术社区  ›  Alex Zakruzhetskyi

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

  •  0
  • Alex Zakruzhetskyi  · 技术社区  · 7 年前

    我有两个模型: InStock Variant :

    class InStock < ApplicationRecord
      has_many :variants
    end
    

    class Variant < ApplicationRecord
      belongs_to :in_stock
    end
    

    在股票指数页面上,我有一个带有列的表: <%= 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>
    

    但是分类不起作用。它没有给我任何错误,只是什么也没发生。有没有什么方法可以让这种数据可以被洗劫?谢谢你。

    1 回复  |  直到 7 年前
        1
  •  5
  •   PGill    7 年前

    将此添加到 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
    
        2
  •  0
  •   Eric Norcross    5 年前

    你应该用铁轨 counter_cache . 这是本书推荐的 this Ransack issue

    variants_count 列到 in_stocks 表和a counter_cache: true 给你的 belongs_to 关系 Variant

    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>