2012-04-30 8 views
19

Kullanıcı modelim var ve kullanıcının has_many evcil olan bir ilişkisi var. ActiveRecord sorgusu yazabilmem mümkün olmak istiyorum "yumuşacık" bir pet.name olan bir evcil hayvan ile tüm kullanıcıları seçebilirsinizRuby on Rails Birleştirme kullanarak ActiveRecord sorgusu

ActiveRecord kullanarak bunu yazmanın en etkili yolu nedir? o aşağıdaki gibi görünecektir düz SQL kullanarak:

select id from users INNER JOIN pets ON u.id = pets.user_id WHERE pets.name != "fluffy"

cevap

37

Bu çalışması gerekir:

User.joins(:pets).where("pets.name != 'fluffy'") 

Ayrica yetkili KO yönergelere following part (joins üzerine) okumak isteyebilirsiniz.

+2

yanılıyorum ama olmaz varsa düzeltin lütfen 'User.joins (: pet) ...' - tekil - sembol parametresi için? – jeffdill2

+2

@ jeffdill2 İlişkilendirmenin nasıl tanımlandığına bağlıdır. Eğer Kullanıcı 'has_one: pet' ise, haklısınız demektir. –

+0

@MikeC ah, sağda. – jeffdill2

14

SQL enjeksiyon açığı olmadan en temiz yolu sorgu parametreleri kullanıyor:

User.joins(:pets).where("pets.name != ?", "fluffy") 

Bazı veritabanı sürücüleri veritabanı sorgusu planını yeniden yukarıdaki için hazırlanmış deyimleri kullanacak. Böyle bir durumda veritabanı sadece param değeri değiştiğinde sorguyu tekrar analiz etmek zorunda kalmaz. raylar ise

24

yapabilirsiniz 4 bu daha da açık:

User.joins(:pets).where.not(pets: { name: 'fluffy' })