对HABTM或HMT相关记录的计数进行Ransack排序

时间:2017-02-01 16:36:37

标签: ruby-on-rails arel ransack

我在ThemeQuote模型之间建立了HABTM关系。 themes index视图显示与每个主题相关的引号计数。我想在该列上添加一个Ransack sort_link,因此themes可以按其关联的quotes计数进行排序。

我使用计数器缓存列成功完成了has_many个关联,但Rails不支持HABTM关联的计数器缓存列。

到目前为止,我已经有一个范围,可以向quotes_count模型添加名为Theme的虚拟属性(通过执行单个查询,避免N + 1):

scope :with_quotes_count, -> do
  joins('LEFT OUTER JOIN quotes_themes on quotes_themes.theme_id = themes.id')
    .select('themes.*, COUNT(quotes_themes.quote_id) as quotes_count')
    .group('themes.id')
end

似乎我必须使用ARel将上述范围转换为“Ransacker”,但到目前为止我的所有尝试都失败了。

我正在使用Rails 4.2.2,ARel 6.0.4和PostgreSQL 9.5.4。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

鉴于您已使用上述范围查询实体,例如您的索引查询始终具有:

# controller
@search = Theme.ransack(params[:q])
@themes = @search.result(distinct: true).with_quotes_count

尝试:

# model
ransacker :quotes_count_sort do
    Arel.sql('quotes_count')
end

并使用sort_link中的排序名称?

答案 1 :(得分:0)

有一些补丁可能对您使用范围有所帮助 访问https://gist.github.com/ledermann/4135215