Łączenie tabel z użyciem własnych warunków

Witam,

zaiste napotkałem problem w momencie kiedy chciałem zrobić jednego dużego joina i bynajmniej tu nie chodziło o ilość a warunki łączenia. Proszę więc o pomoc.

Jeżeli zrobię np:

@users = User.find(:all, :joins => 'books')

Oczywiste jest, że rails połączy tabele na zasadzie books.user_id = users.id

Teraz załóżmy, że tabela ‘users’ ma pole ‘profile_id’, a tabela ‘books’ ma pole ‘page_id’. Pytanie - jak za pomocą railsów(nie używając czystego kodu sql) połączyć tabele aby ‘users.profile_id = books.page_id’, czyli jednym słowem zdefiniować swój warunek łączenia. W czystym kodzie sql wyglądało by to tak:

SELECT `users`.* FROM `users` LEFT OUTER JOIN books ON books.page_id = users.profile_id

Jest to wykonalne? Czy może ja kompletnie źle rozumuje i powinno się takie rzeczy robić w inny sposób?
Dodatkowo też muszę połączyć ze sobą 5 tabel. Proszę podpowiedzieć jak miała by wtedy wyglądać składnia dla więcej niż jednego joina(i zdefiniowanego dla kazdego joina warunku).

Ps. Cały czas mam wrażenie, że w ogolę jakoś źle rozumuje w tym temacie i szukam daremnie rozwiązania…

Do :joins możesz podać kod SQL, np.

  User.all( :joins => 'LEFT OUTER JOIN books ON books.page_id = users.profile_id', :conditions => ["books.page_id = ?", 1000] )

Co do joina przez kilka tabel możesz zrobić coś takiego

  User.all( :joins => { :books => { :author => { :contacts => itd itd } } } )

albo napisać joina w sqlu tak jak w pierszym przykładzie

A tak w ogóle czytanie dokumentacji nie powinno boleć :slight_smile:

Czyli jednak nie ma zadnej metody bazujacej na poleceniach railsowych, unikajacych kodu SQL?

User.all( :joins => 'LEFT OUTER JOIN books ON books.page_id = users.profile_id')

PS. Rozumiem, ze w '… ’ moge podac nieskonczenie dlugie te zapytanie, tzn skladajace sie z kilku joinow?:slight_smile:

Można wszystko, pytanie czy to ma sens :slight_smile:
Nie sprawdzałem, ale powinno zadziałać coś takiego

[code=ruby]class User < ActiveRecord::Base

has_many :books, :foreign_key => ‘page_id’, :primary_key => ‘profile_id’

end[/code]
User.all( :joins => :books ) wygeneruje takie zapytanie jak chcesz. Prawie… zamiast OUTER JOIN będzie INNER JOIN. Jeśli faktycznie potrzebujesz outer joina, musisz napisać kod w czystym sqlu.

Skoro pytam, to znaczy, ze mam w tym cel :slight_smile: Dziekuje za odpowiedz :slight_smile: Szkoda, ze nie mozna tego powyzszego jakos milo w joinie umiescic :slight_smile:

Założeniem ActiveRecordu była i jest separacja dewelopera od surowego SQL, ale tylko póki ma to sens i bez fanatyzmu :slight_smile: