2016-10-11 12 views
1
までのクエリ

has_many :throughを照会して、相手側に空の関連付けがあるレコードを確認するにはどうすればよいですか?空のhas_manyから

class Specialty 
    has_many :doctor_specialties 
    has_many :doctor_profiles, through: :doctor_specialties 

class DoctorProfile 
    has_many :doctor_specialties 
    has_many :specialties, through: :doctor_specialties 

class DoctorSpecialty 
    belongs_to :doctor_profile 
    belongs_to :specialty 

は私がSpecialtyの上に列挙することにより、これを行うことができます(私はレール5を使用しています)が、私はSQLクエリでそれを行うにしたいと思います。

Specialty.includes(:doctor_profiles).all.select{|x| x.doctor_profiles.length == 0 } 

答えて

3
Specialty.includes(:doctor_profiles).where(doctor_profiles: { id: nil }) 

ARの照会詳細はActive Record Query Interfaceを参照してください。

あなたがRailsの> = 5にしているので、あなたはleft_outer_joins(THX @gmcnaughton )使用することができます:あなたはまた、次のクエリを使用してこれを達成することができます

Specialty.left_outer_joins(:doctor_profiles).where(doctor_profiles: { id: nil }) 
+1

Rails 5からは、 'includes'ではなく' left_outer_joins'を使用できます - http://guides.rubyonrails.org/active_record_querying.html#left-outer-joinsを参照してください – gmcnaughton

0
Speciality.joins('left join doctor_profiles on doctor_profiles.speciality_id = specialities.id').where(doctor_profiles: {id: nil}) 
1

を。

Specialty.where.not(id: DoctorSpecialty.select(:speciality_id)) 

上記のステートメントは、クエリ内でクエリを作成します。テーブル結合の必要はありません。

関連する問題