Has_many tablosuna bir iç birleştirme gerçekleştirmek, bir groupveya uniqpotansiyel olarak çok verimsizdir ve SQL'de bu, EXISTSilişkili bir alt sorgu ile kullanılan bir yarı birleştirme olarak daha iyi uygulanacaktır .
Bu, sorgu iyileştiricisinin boş pozisyonlar tablosunu doğru proje kimliğine sahip bir satırın varlığını kontrol etmesine olanak tanır. Bu proje kimliğine sahip bir satır veya bir milyon olması fark etmez.
Bu, Rails'de o kadar kolay değil, ancak şunlarla sağlanabilir:
Project.where(Vacancies.where("vacancies.project_id = projects.id").exists)
Benzer şekilde, boş pozisyonu olmayan tüm projeleri bulun:
Project.where.not(Vacancies.where("vacancies.project_id = projects.id").exists)
Düzenleme: son Rails sürümlerinde exists, arel için yetkilendirilmeye güvenmemenizi söyleyen bir kullanımdan kaldırma uyarısı alırsınız . Bunu şu şekilde düzeltin:
Project.where.not(Vacancies.where("vacancies.project_id = projects.id").arel.exists)
Düzenleme: Ham SQL'den rahatsızsanız şunları deneyin:
Project.where.not(Vacancies.where(Vacancy.arel_table[:project_id].eq(Project.arel_table[:id])).arel.exists)
Kullanımını gizlemek için sınıf yöntemleri ekleyerek bunu daha az karmaşık hale getirebilirsiniz arel_table, örneğin:
class Project
def self.id_column
arel_table[:id]
end
end
... yani ...
Project.where.not(
Vacancies.where(
Vacancy.project_id_column.eq(Project.id_column)
).arel.exists
)