Ransack对HABTM或HMT相关记录的计数进行排序
我在Theme
和Quote
模型之间有HABTM关系。 themes
index
视图显示与每个主题关联的引号计数。 我想在该列上添加一个Ransack sort_link
,因此可以按照相关quotes
的数量对themes
进行排序。
我使用计数器缓存列成功完成了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将上述范围转换为“Ransacker”,但到目前为止我所有的尝试都失败了。
我正在使用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