Raylar için4:
Yani, istediğiniz bir iç birleşimdir, bu yüzden sadece birleşimleri yüklemelisiniz:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
Ancak, kayıt için, bir "NOT NULL" koşulu istiyorsanız, sadece yüklem olmayan ifadeyi kullanın:
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
Bu sözdiziminin bir kullanımdan kaldırma bildirdiğini unutmayın (bir dize SQL snippet'i hakkında konuşur, ancak karma koşul ayrıştırıcıdaki dizeye değiştirildi mi sanırım?), Bu yüzden sonuna referans eklediğinizden emin olun:
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
DEPRECATION UYARI: Bir dizgi SQL snippet'inde başvurulan tablo (lar) ı (aşağıdakilerden biri: ....) yüklemeye hevesli görünüyorsunuz. Örneğin:
Post.includes(:comments).where("comments.title = 'foo'")
Şu anda, Active Record dizedeki tabloyu tanır ve yorumları ayrı bir sorguya yüklemek yerine yorum tablosuna sorguya KATILMAYI bilir. Ancak, bunu tam gelişmiş bir SQL ayrıştırıcısı yazmadan yapmak doğal olarak kusurludur. Bir SQL ayrıştırıcısı yazmak istemediğimizden, bu işlevi kaldırıyoruz. Şu andan itibaren, bir dizeden bir tabloya başvururken Active Record'a açıkça söylemelisiniz:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
!nil
için değerlendirirtrue
Ruby ve AREL çevirirtrue
için1
bir SQL sorgusunda. Oluşturulan sorgu aslında istediğin şey - bu bir ARel hatası değildi.