2013-03-06 2 views
0

Предположим, у меня есть две модели, submissionhas_manysubmissionstateКак переписать этот SQL-запрос в Rails 3?

и таблица submissionstates имеет следующие столбцы:

id | submission_id | state_id | created_at 

и запрос

SELECT submission_id, state_id 
FROM submissionstates ss 
JOIN (
    SELECT MAX(created_at) as created_at 
    FROM submissionstates ss 
    GROUP BY submission_id 
) x 
ON ss.created_at = x.created_at 
WHERE state_id = 0 
+0

Документация RoR по запросам должна помочь вам http://guides.rubyonrails.org/active_record_querying.html –

+1

См. - http://stackoverflow.com/questions/7016422/how-to-convert-sql-query-to-rails-active-record-query –

ответ

1

как ссылку Саурабх дал, вы в конечном итоге поместить ваши sql-фрагменты в методы запросов rails; что-то вроде этого

list = SubmissionState.select("submission_id, state_id") 
    .where(:state_id => 0) 
    .joins(" 
    JOIN (
     SELECT MAX(created_at) as created_at 
     FROM submissionstates ss 
     GROUP BY submission_id 
    ) x 
    ON ss.created_at = x.created_at 
    ") 

puts list.length 

быть честным в этот момент вы могли бы быть лучше только с помощью find_by_sql

sql = " 
    SELECT submission_id, state_id 
    FROM submissionstates ss 
    JOIN (
    SELECT MAX(created_at) as created_at 
    FROM submissionstates ss 
    GROUP BY submission_id 
) x 
    ON ss.created_at = x.created_at 
    WHERE state_id = ? 
    AND some_other_value = ? 
" 

list = SubmissionState.find_by_sql([sql, 0, 'something-else']) 
puts list.length 

Примечание: как только вы начинаете использовать присоединяется или find_by_sql рельсы действует как это дает вам объекты обратно, но на самом деле они будут содержать любые атрибуты, определенные в предложении select, и find_by_sql возвращает все атрибуты в виде строк, которые могут раздражать

+0

хм .. Мне просто интересно, какой из них более эффективен? 'find_by_sql' или' Active Record Query Interface'? –

+0

«Мне просто интересно, какой из них эффективнее?» > Мое предположение о том же - вы можете опуститься на более низкий уровень и вернуться вместо хэша - http://blog.daniel-azuma.com/archives/216 – house9

Смежные вопросы