【问题标题】:Rails ActiveRecord query to match all paramsRails ActiveRecord 查询以匹配所有参数
【发布时间】:2016-12-17 19:46:31
【问题描述】:

我需要一个 ActiveRecord Postgres 查询,它返回与通过数组传入的所有参数匹配的结果。

一些背景:我有一个用户模型,它有很多主题(通过专业)。我将主题 ID 作为字符串 (Parameters: {"topics"=>"1,8,3"}) 传递,然后将它们转换为带有 .split(',') 的数组,所以我最终得到 topic_params = ["1","8","3"]

现在我正在尝试返回具有匹配/包含所有主题的所有用户。在遵循this question 中的答案后,我设法返回了与任何主题匹配的用户:

@users = User.includes(:topics, :organization).where(:topics => {:id => topic_params})

但我需要它返回匹配所有的结果。我也愿意接受更好的方法来完成这类任务。

【问题讨论】:

  • @Iceman,感谢您的链接。在这种情况下,我将如何以 ActiveRecord 格式编写它?
  • ActiveRecord 有 havingto_sql 方法来帮助你。
  • @muistooshort,感谢您提供的信息。我将如何利用它们?

标签: sql ruby-on-rails ruby postgresql activerecord


【解决方案1】:

一种方法是这样的

User.joins(:topics).where(topics: { id: [1, 2, 3] }).group('users.id').having('count(distinct topics.id) = 3')

显然我没有你的确切架构,所以你可能需要稍微调整一下,但这是基本设置。

重要的是,有子句计数器必须与您匹配的项目数匹配。

【讨论】:

  • 我如何反映要匹配的项目数量是可变的?这意味着它的范围可以从 1 到 ~10(而不是设置为 3)。
  • having('count(distinct topics.id) = ?', topic_params.split(',').count) 或类似的东西
  • 好的。另一部分:有没有一种方法可以急切加载其他表,因为如果可能的话,我想这样做。
猜你喜欢
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2021-08-27
相关资源
最近更新 更多