0

約 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.* FROM email_sessionsINNER JOIN email_statsONを選択しますemail_statsemail_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.* FROM email_sessionsINNER JOIN email_statsON email_stats. email_session_id= email_sessions. idWHERE ( email_sessions.user_id = 374) AND (email_stats.event_type = "open") ORDER BY email_stats.created_at DESC

4

0 に答える 0