根据 HABTM 或 HMT 相关记录的计数进行洗劫排序



我在ThemeQuote模型之间有一个HABTM关系。themes index视图显示与每个主题关联的报价计数。我想在该列上添加一个 Ransack sort_link,以便themes可以按其关联quotes计数进行排序。

我已经成功地使用计数器缓存列has_many关联完成了此操作,但 Rails 不支持 HABTM 关联的计数器缓存列。

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

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 将上述范围转换为"洗劫者",但到目前为止,我的所有尝试都失败了。

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

任何帮助将不胜感激。

假设您使用上述范围查询了实体,例如,索引查询始终具有:

# 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中使用排序的名称?

有一些

补丁可以帮助您使用范围参观 https://gist.github.com/ledermann/4135215

相关内容

  • 没有找到相关文章

最新更新