【问题标题】:has_and_belongs_to_many exact matches by idhas_and_belongs_to_many 按 id 完全匹配
【发布时间】:2017-04-03 23:57:33
【问题描述】:

我正在使用一个非常标准的 has_and_belongs_to_many 关联,就像 Rails 关联指南中的示例: http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

问题是我想查询以找到与零件完全匹配的组件。例如, 装配有 2 个与之关联的部件,部件的 id 为 1、2。

以下是我失败的方法:

Assembly.joins(:parts).where(parts: {id: [1,2]})

Assembly.joins(:parts).
  where('parts.id IN (?)', [1,2]).
  group('assemblies.id').
  having('COUNT(assemblies.id) >= ?', [1,2].length)

(这个 SO 回答建议了这个:Rails scope - where in exact matches

这些方法返回的 Assembly 对象只有 ID 为 1 和 2 的 Parts 包含在其关联的 Parts 中。但同样,我想要的只是具有这 2 个部件(ID 1 和 2)的组件。

请帮忙!

【问题讨论】:

  • @jazzinthermorning,你能说一下你用的是什么数据库吗?
  • 是的,使用 PostgreSQL

标签: ruby-on-rails activerecord ruby-on-rails-5


【解决方案1】:

更新: PostgreSQL 数组中的元素顺序是导入的。可以在ARRAY_AGG 函数中使用ORDER BY

Assembly.joins(:parts).
  group('assemblies.id').
  having('ARRAY[?] = ARRAY_AGG(parts.id ORDER BY parts.id)', [1,2].sort)

第一版:

如果你使用的是 PostgreSQL,你可以使用ARRAY_AGG 组函数:

Assembly.joins(:parts).
  group('assemblies.id').
  having('ARRAY[?] = ARRAY_AGG(parts.id)', [1,2])

【讨论】:

  • 此外,使用您的查询,顺序很重要,这似乎不切实际。关于如何匹配包含零件 ID 的组件的任何想法,无论顺序如何,即在将 ID 传递为 [1,2] 或 [2,1] 时获得相同的组件?
  • 感谢您的更新,我没有想到 order_by 和 sort,太棒了。
  • 对于在 postgres 中 id 为 uuid 的人,Assembly.joins(:parts). group('assemblies.id').having('ARRAY[?] = ARRAY_AGG(parts.id::text ORDER BY parts.id::text)', ['1212-afzaz-12','22412-afzafza-1232'].sort)
猜你喜欢
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 2011-10-04
相关资源
最近更新 更多