大约两周前,我将我的 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
.* FROMemail_sessions
INNER JOINemail_stats
ONemail_stats
。email_session_id
=email_sessions
。id
在哪里email_sessions
。user_id
= 374 AND (email_stats.event_type = "open") 按 email_stats.created_at DESC 排序
导轨 3.0
选择
email_sessions
.* 从email_sessions
内部连接email_stats
打开email_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