0

大约两周前,我将我的 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

SELECT DISTINCT email_sessions.* FROM email_sessionsINNER JOIN email_statsON email_statsemail_session_id= email_sessionsid在哪里email_sessionsuser_id= 374 AND (email_stats.event_type = "open") 按 email_stats.created_at DESC 排序

导轨 3.0

选择email_sessions.* 从email_sessions内部连接email_stats打开email_statsemail_session_id= email_sessionsidWHERE ( email_sessions.user_id = 374) AND (email_stats.event_type = "open") ORDER BY email_stats.created_at DESC

4

0 回答 0