Mam dosyć dziwny problem, w skrócie mam dwa modele (załóżmy że są to Book i Publisher, gdzie books ma publisher_id (M:1)).
Pisząc proste zapytanie
select * from books inner join publishers on books.publisher_id = publishers.id;
otrzymuje to co powinienem, dwie złączone tabele na danym warunku. Nic specjalnego.
Problem zaczyna się, gdy próbuję użyć metody joins.
Book.joins(:publisher)
wyświetla zapytanie
SELECT * FROM “books” INNER JOIN “publishers” ON “publishers”.“id” = “books”.“publisher_id”
czyli niby wszystko okey, ale zwrócny jest zbiór obiektów reprezentujący tylko jeden typ obiektów (a właściwie ten na rzecz którego modelu została wywołana metoda).
Na logikę, powinno zwrócić zestaw obiektów z atrybutami obu modeli po połączeniu, pytanie więc moje dlaczego tak się nie dzieje?
Oczywiście że lepiej i takiego rozwiązania używam, rzecz w tym że staram się zagłebić w active record i dziwi mnie fakt że nie działa joins, dlatego zastanawiam się czy bug, czy coś sam źle robię.
Skoro jest w interfejsie metoda, to znaczy że po coś została tam dodana i wypadałoby by działała, no nie? ; )
Po prostu musisz zrozumieć co Ci pokazuje ActiveRecord, a co chowa przed Twoimi oczami póki tego faktycznie nie potrzebujesz
Domyślnie ActiveRecord opakuje Ci to wszystko w model, z którego wykonałeś zawołanie – czyli w tym przykładzie w kolecję obiektów klasy Book.
Ale, ponieważ użyłeś joins, od razu się wyciągnęli wszyscy pasujący wydawcy, więc jeśli miałeś zdefiniowaną relację ActiveRecord-ową, to przy wywołaniu metody publisher na obiekcie klasy Book (czyli jednym z tej kolekcji którą dostałeś) otrzymasz obiekt klasy Publisher, już wyciągnięty z bazy.
Po prostu musisz zrozumieć co Ci pokazuje ActiveRecord, a co chowa przed Twoimi oczami póki tego faktycznie nie potrzebujesz
Domyślnie ActiveRecord opakuje Ci to wszystko w model, z którego wykonałeś zawołanie – czyli w tym przykładzie w kolecję obiektów klasy Book.
Ale, ponieważ użyłeś joins, od razu się wyciągnęli wszyscy pasujący wydawcy, więc jeśli miałeś zdefiniowaną relację ActiveRecord-ową, to przy wywołaniu metody publisher na obiekcie klasy Book (czyli jednym z tej kolekcji którą dostałeś) otrzymasz obiekt klasy Publisher, już wyciągnięty z bazy.[/quote]
Spoko, już ogarniam w czym rzecz. Dzięki!