在ActiveRecord中使用uniq

时间:2013-02-20 07:48:05

标签: ruby activerecord

运行这行代码

Activity.uniq.select(:ip).where("created_at > NOW() - INTERVAL 1 DAY").count

返回所有行的数量(没有uniquness过滤器)尽管SQL是正确的(使用DISTINCT关键字)

如果我分两步运行此命令:

c = Activity.uniq.select(:ip).where("created_at > NOW() - INTERVAL 1 DAY")
c.size

然后我得到正确的数字。

怎么可能?

谢谢

1 个答案:

答案 0 :(得分:1)

通常DISTINCT会从结果集中删除重复的结果,但不会进行任何分组。由于COUNT结果中有一行,因此您不会看到任何效果。你真正想要的是:

SELECT COUNT(DISTINCT activities.ip) FROM activities WHERE ...

请注意,您希望 计算不同的活动,而不是明确的计数。

我不确定你是如何设法使用ActiveRecord发出这个SQL的。您可能需要直接使用ActiveRecord connection并使用select_value进行此类异常调查,除非您可以指导select为您执行此操作。