2016-12-07 63 views
2

我有兩個型號,FacilityCategory匹配:軌道4 - 連接查詢所有陣列

class Facility < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :facilities 
end 

說我有三個可能的Category記錄,與name: 「A類」, 「B類」 和「C類」。

我想獲得均爲「A類」和「B類」的所有Facility記錄。

我最近的查詢是:

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執行此查詢?

回答

2

我能夠與來自has_and_belongs_to_manyhas_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。