約 2 週間前に、Rails アプリを 3.0 から 3.2 に更新しました (ちょうど 4 に間に合いました! はぁ)。とにかく、奇妙なことに気付きました — 古いバージョンでは正しい順序で結果を返したクエリが、3.2 では一貫して間違った結果を返すようになっています。
クエリは次のとおりです。
@sessions = user.email_sessions.joins(:email_stats)
.where('email_stats.event_type = "open"')
.order('email_stats.created_at DESC')
.uniq
Rails 3.2 のこのクエリは、次のタイムスタンプを返します。
2013-06-18 12:02:05 -0400
2013-06-18 11:24:22 -0400
2013-06-18 10:41:52 -0400
2013-06-18 12:09:42 -0400
2013-06-18 10:02:26 -0400
2013-06-18 10:24:40 -0400
2013-06-18 08:59:19 -0400
2013-06-18 08:59:19 -0400
2013-06-18 08:51:39 -0400
2013-06-14 15:47:28 -0400
一方、3.0 では、次のようになります。
2013-06-18 12:09:42 -0400
2013-06-18 12:03:23 -0400
2013-06-18 12:02:05 -0400
2013-06-18 11:24:22 -0400
2013-06-18 10:41:52 -0400
2013-06-18 10:24:40 -0400
2013-06-18 10:02:26 -0400
2013-06-18 08:59:19 -0400
2013-06-18 08:59:19 -0400
2013-06-18 08:51:39 -0400
それは良い!Rails 3.2 はまずい!誰でもこの問題に光を当てることができますか?
更新:たまたま Rails 3.1 をチェックしたことがあり、3.2 に移行する途中で簡単に確認しました。そのブランチの最新のコミットをチェックアウトしましたが、日付は良好です。この問題が発生するのは 3.2 だけです。
更新 2:以下の Dhurv の質問のおかげで、両方のバージョンの Rails で生の SQL が生成されるようになりました。最初に .to_sql メソッドを使用し、後者をログから取得しました。違い: .uniq メソッドは 3.2 にしかありません。
レール3.2
DISTINCT
email_sessions
.* FROMemail_sessions
INNER JOINemail_stats
ONを選択しますemail_stats
。email_session_id
=email_sessions
.id
どこemail_sessions
で。user_id
= 374 AND (email_stats.event_type = "open") ORDER BY email_stats.created_at DESC
レール3.0
SELECT
email_sessions
.* FROMemail_sessions
INNER JOINemail_stats
ONemail_stats
.email_session_id
=email_sessions
.id
WHERE (email_sessions
.user_id = 374) AND (email_stats.event_type = "open") ORDER BY email_stats.created_at DESC