2016-12-07 2 views
2

に私は2つのモデル、FacilityCategory持って一致した参加:Railsの4 - クエリは、すべての配列

class Facility < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :facilities 
end 

は私がnameで、三つの可能なCategoryレコードを持って言ってやるがいい。 "カテゴリーA"、 "カテゴリーB" を、そして「カテゴリC」。

にあるすべてのFacilityレコードを「カテゴリA」と「カテゴリB」の両方で取得したいと考えています。

私の最新のクエリは次のとおりです。次のSQLを生成

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

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 ...)を使用すると、少なくとも1つの「カテゴリA」と「カテゴリB」の両方に属するデータベースにFacilityが少なくとも1つあることがわかります。

このクエリは、Railsでもarelを使っても実行できますか?

答えて

2

私はhas_many, throughhas_and_belongs_to_manyからの切り替えでこれを解決することができた、と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を書いてください。

関連する問題