【问题标题】:Ransack sort on count of HABTM or HMT associated records根据 HABTM 或 HMT 相关记录的计数进行搜查排序
【发布时间】:2017-06-18 12:06:37
【问题描述】:

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

我已经通过使用计数器缓存列的has_many 关联成功地做到了这一点,但是 Rails 不支持 HABTM 关联的计数器缓存列。

到目前为止,我已经有了一个范围,它向Theme 模型添加了一个名为 quotes_count 的虚拟属性(通过执行单个查询,避免 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。

任何帮助将不胜感激。

【问题讨论】:

  • 我不确定您是否可以使用范围进行排序。我一直使用 Arel 包装器。

标签: ruby-on-rails arel ransack


【解决方案1】:

假设您使用上述范围查询您的实体,例如您的索引查询总是有:

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

【讨论】:

  • 太棒了,你介意接受它作为答案吗? :)
  • 当然!如果您有兴趣,我也有this 的问题,您可能知道答案。
【解决方案2】:

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

【讨论】:

  • 感谢您的回答。那个补丁是4年前写的。搜查currently supports scopes。问题是,到目前为止,我一直无法编写一个像这个问题中描述的那样工作的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多