0

2つのモデルがあるとします。submission has_many submissionstate

テーブル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
4

1 に答える 1

1

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はすべての属性を文字列として返します。

于 2013-03-06T15:54:25.143 に答える