Rails 4 - Join Query匹配数组中的所有内容

时间:2016-12-07 14:24:05

标签: ruby-on-rails ruby-on-rails-4 arel

我有两个模型,FacilityCategory

class Facility < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

class Category < ActiveRecord::Base
  has_and_belongs_to_many :facilities
end

假设我有三条可能的Category条记录,name:&#34;类别A&#34;,&#34;类别B&#34;和&#34;类别C&# 34。

我希望获得的所有Facility条记录&#34;类别A&#34;和&#34; B类&#34;。

我的最新疑问是:

Facility.joins(:categories).merge(Category.where(Category.arel_table[:name].matches_all(["Category A", "Category B"])))

生成以下SQL:

SELECT "facilities".* FROM "facilities" INNER JOIN "categories_facilities" ON "categories_facilities"."facility_id" = "facilities"."id" INNER JOIN "categories" ON "categories"."id" = "categories_facilities"."category_id" WHERE ("categories"."name" ILIKE 'Category A' AND "categories"."name" ILIKE 'Category B')

这不会返回任何结果。

使用纯Ruby(例如Facility.all.select ...),我知道数据库中至少有一个Facility属于两者,只有两个&#34; A类和#34;和&#34; B类&#34;。

如何在Rails中或使用arel?

执行此查询

1 个答案:

答案 0 :(得分:2)

我可以通过从has_and_belongs_to_many切换到has_many, through以及Facility上的以下范围来解决此问题:

joins(:categories)
  .merge(Category.where(key: category_keys))
  .group(CategoriesFacility.arel_table[:facility_id], arel_table[:id])
  .having(CategoriesFacility.arel_table[:facility_id].count.gteq(category_keys.size))
  .uniq

理想情况下,我还想使用HABTM表,但我不想在我的代码中编写原始SQL。