2017-02-18 23 views
9

--Edit--Wyniki kolejności railsów z wieloma złączeniami do tej samej tabeli

Chciałem uprościć to pytanie. z tym modelem struktury:

has_one :pickup_job, class_name: 'Job', source: :job 
has_one :dropoff_job, class_name: 'Job', source: :job 

Co chcę zrobić jest:

Package.joins(:dropoff_job, :pickup_job).order(pickup_job: {name: :desc}) 

To nie jest oczywiście ważna, rzeczywista składni, które powinny być wykorzystywane jest:

.order('jobs.name desc') 

jednak sposób, w jaki szyny łączą się z tabelami, oznacza, że ​​nie mogę zagwarantować, jak będzie wyglądać nazwa aliasu tabeli (jeśli w ogóle), a to spowoduje zamówienie przez dropoff_job.name zamiast pickup_job.name

irb(main):005:0> Package.joins(:dropoff_job, :pickup_job).order('jobs.name desc').to_sql 
=> "SELECT \"packages\".* FROM \"packages\" INNER JOIN \"jobs\" ON \"jobs\".\"id\" = \"packages\".\"dropoff_job_id\" INNER JOIN \"jobs\" \"pickup_jobs_packages\" ON \"pickup_jobs_packages\".\"id\" = \"packages\".\"pickup_job_id\" ORDER BY jobs.name desc" 

Również nie jestem w kontroli, jak tabele są połączone, więc nie mogę zdefiniować alias tabeli.

--UPDATE--

miałem grać z starając się wyodrębnić nazwy aliasów z bieżącego zakresu korzystania coś takiego:

current_scope.join_sources.select { |j| j.left.table_name == 'locations' } 

Ale nadal jestem trochę zakleszczony i czuć tak jak powinno być DUŻO prostsze rozwiązanie. Odpowiedź

--UPDATE--

fauna działa w niektórych scenariuszach, ale szukam rozwiązania, które jest nieco bardziej dynamiczna.

Odpowiedz

0

Można spróbować czegoś jak ten

Package.joins("INNER JOIN locations as dropoff_location ON dropoff_location.id = packages.dropoff_location_id INNER JOIN locations as pickup_location ON pickup_location.id = packages.pickup_location_id) 

ideą jest stworzenie własny alias podczas łączenia tabeli

+0

Problem polega na tym, że sam nie robię złączeń. Używam klejnotu o nazwie filterrific. Myślę, że musi istnieć sposób na uzyskanie nazwy aliasu z 'current_scope'? – Rick

+0

Dałem ci nagrodę, ponieważ twoja odpowiedź jest bliższa temu, czego szukam, ale w żaden sposób nie jest idealnym rozwiązaniem, którego szukałem. – Rick

5

Użyj połączeniem nazwa stowarzyszenia w liczbie mnogiej i obecną nazwą tabeli jako nazwa aliasu tabeli w metodzie ::

+1

Rozumiem, w jaki sposób szyny generują alias, ale zakładam, że część zamówienia jest skonfigurowana jako zakres i nie wiem, do której kolejności zostały przyłączone tabele. Mógłbym użyć tego statycznego tekstu '' pickup_jobs_packages.name desc'', ale to się nie powiedzie, jeśli pickup_job dołączył pierwszy. Mógłbym zmienić tekst zlecenia na ''obss.name desc'', ale to będzie zawsze porządkowane przy pierwszym sprzężeniu. – Rick