大约两周前,我将我的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 为什么?
Rails 3.2
SELECT DISTINCT
email_sessions
。* FROMemail_sessions
INNER JOINemail_stats
ONemail_stats
。email_session_id
=email_sessions
。id
WHEREemail_sessions
。user_id
= 374 AND(email_stats.event_type =“open”)ORDER BY email_stats.created_at DESC
Rails 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