ruby-on-rails - Rails 4 - 连接查询匹配数组中的所有内容

标签 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 记录,其名称:“类别 A”、“类别 B”和“类别 C”。

我想要获取“类别 A”和“类别 B”中的所有设施记录。

我最新的查询是:

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属于两者且仅属于两者“A 类”和“B 类”。

如何在 Rails 中或使用 arel 执行此查询?

最佳答案

我能够通过从 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。

关于ruby-on-rails - Rails 4 - 连接查询匹配数组中的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41019901/

相关文章:

ruby-on-rails - 无法加载从 GitHub 获取的 Rails 应用; rake,rails 服务器不工作

mysql - 500 启动新用户 session 时生产适配器 rails 出错

ruby-on-rails - Ruby on Rails多个型号名称

ruby-on-rails - 什么是 'Rails Way'实现数据动态上报系统

ruby-on-rails - 为什么 Awesome Print 在某些 Rails 集合对象上不起作用?

sql - Rails ActiveRecord 多态关联关系

ruby-on-rails - 如何使用 Rails 中的构建器生成自定义表单

ruby-on-rails - Rails/Arel:将所有记录选择为ActiveRecord::Relation

sql - 使用多个 Arel OR 子句时省略链式括号

ruby-on-rails - 自动选择 ActiveRecord 中连接表的所有列的方法?