Rails find_by_sql问题

时间:2011-04-18 22:25:16

标签: mysql ruby-on-rails

我的RoR脚本中有以下调用:

Foo.where("event = 'Login'").group('user_id').order('user_id ASC').count()

这为我提供了所有用户的列表以及他们以下列形式登录的内容:

<userid1> => <count>, <userid2> => <count>, ...}

这很棒,非常接近我想要的东西,但我一直无法说服它按登录计数排序,而是我真的很喜欢它。还有一个列以字符分隔字符串的形式提供有关登录会话的一些信息。我想知道这些信息的某些部分。

为了达到这个目的,我尝试使用find_by_sql,当我进行以下调用时:

Foo.find_by_sql("SELECT userid, COUNT(*) AS number, SUBSTRING_INDEX(stuff, ',', 1) AS info FROM <table> WHERE event = 'Login' GROUP BY userid")

我得到的是包含用户ID但不包含计数或信息的Foo条目。当我在MySQL工作台中运行它时,它就像一个魅力。为了让它发挥作用,我还需要做些什么吗?还有,有没有办法使用Foo.select或Foo.where来做到这一点?感谢。

更新我也尝试了这种格式,如here所示:

Foo.find(:all, :select => 'count(*) count, userid', :group =>'userid')

但是这也仅仅响应了用户标识并且没有吐出计数。

更新2 再看一下输出我现在可以看到,当我执行find_by_fql调用时,所有内容都以正确的方式被找到,甚至被排序。它实际上并没有选择COUNT(*)或SUBSTRING_INDEX。

更新3 我还尝试了this SO提示,但是当我告诉它时:

Foo.find(:all, :select => 'userid, count(*) as cnt', :group => 'userid')

它不会打印或找到与var cnt相关的任何内容。我在这里完全感到困惑,因为我现在已经看到不止一个例子,这样做^^方式,我还没有让它成功。

2 个答案:

答案 0 :(得分:1)

实际上,您的问题不是SQL问题。要生成正确的SQL,您只需要:

Foo.where("event = 'Login'").group('user_id').order('count_all').count()

查看您的日志,您会发现这会生成以下SQL:

SELECT COUNT(*) AS count_all, user_id AS school_id FROM `foos` GROUP BY user_id ORDER BY count_all

...如果你在SQL控制台中运行它,你就会得到你想要的东西。

问题是Rails不会按此顺序返回它们,Rails 始终会按{{1}的顺序返回这些特殊的group/count结果}}字段。所以,如果你想要它们的顺序不同,那么你需要在获取哈希值之后在Ruby中完成它。

答案 1 :(得分:0)

下面的代码返回一个foos数组,检查foo中的任何元素都将返回userid / cnt

foos = Foo.find(:all, :select => 'userid, count(*) as cnt', :group => 'userid')

这是你要找的吗?

foos.first.userid # will show userid
foos.first.cnt # will show count