2012-04-30 10 views
19

Mam model użytkownika, a użytkownik ma związek, który ma has_many zwierzęta domowe. Chcę mieć możliwość napisania kwerendy ActiveRecord, w której mogę wybrać wszystkich użytkowników ze zwierzęciem, który nie ma zwierzaka. Nazwa "puszystego"Zapytanie Ruby on Rails ActiveRecord przy użyciu join

Jaki jest najbardziej skuteczny sposób na zapisanie tego przy pomocy ActiveRecord? Stosując prostą SQL to wyglądać mniej więcej takie jak:

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

Odpowiedz

37

To powinno działać:

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

Również warto przeczytać following part (na joins) w sprawie wytycznych oficjalnych RoR.

+2

Proszę mnie poprawić, jeśli się mylę, ale czy nie byłoby „User.joins (PET) ...” - w liczbie pojedynczej - dla parametru symbolu? – jeffdill2

+2

@ jeffdill2 To zależy od definicji powiązania. Jeśli na przykład User 'has_one: pet', masz rację. –

+0

@MikeC ah, tuż. – jeffdill2

14

najczystszy sposób bez podatności SQL injection jest za pomocą parametrów zapytania:

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

Niektóre sterowniki baz danych będzie wykorzystywać przygotowane oświadczenia dla wyżej do ponownego użycia planu kwerend bazy danych. W takim przypadku baza danych nie musi ponownie analizować zapytania, gdy zmienia się tylko wartość parametru.

24

w szynach 4 Można zrobić to jeszcze bardziej oczywiste:

User.joins(:pets).where.not(pets: { name: 'fluffy' }) 
Powiązane problemy