My last post was on the best way to write a SQL query with conditions on a LEFT OUTER JOIN:
LEFT OUTER JOIN with conditions (where, order by)?
Now, I need to convert that good piece of SQL into a sweet Active Record Query (Rails 3). ;-)
I have 2 Models:
Training has_many :training_histories
TrainingHistory belongs_to :training
How can I write a scope to get the results the SQL below retrieve ?
SELECT tc.id, tc.name, tc.order,
th.id as history_id, th.finished_at, th.score
FROM trainings tc
LEFT OUTER JOIN training_histories th ON th.training_id = tc.id
and th.id =
(SELECT th1.id from training_histories th1 where th1.training_id = tc.id
and th1.finished_at is not null
order by th1.finished_at desc limit 1)
WHERE tc.id > 4
AND tc.id < 8
GROUP BY tc.id
ORDER BY tc.order_by ASC, tc.id ASC
I want to retrieve all the records of TRAININGS and add the last valid (aka finished) associated record of TRAINING_HISTORIES.
Any suggestions ?
Thank you
For rails 3, try this:
Basically, you're just converting your pre-written query into Rails 3 finder methods.