Saurabhが提供したリンクのように、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の使用を開始すると、railsはオブジェクトを返すように機能しますが、実際にはselect句で定義された属性が含まれ、find_by_sqlはすべての属性を文字列として返します。