Rails SQL 语句转变成 rails 语句问题

menghuanwd · 2012年11月04日 · 最后由 menghuanwd 回复于 2012年11月05日 · 5746 次阅读

select user_id from topics group by user_id order by count(user_id) desc 上面语句的 rails 该怎么写?

Topics.where(:user_id => user_id).group("topics(user_id)").order("user_id DESC")

不知道是不是我上面的写法,不过我估计是错的。^_^ 可以参考这里:http://guides.rubyonrails.org/active_record_querying.html

#1 楼 @JeskTop group 直接 user_id 就可以,你这么写可能有问题

Topic.select(:user_id).group(:user_id).order("count(user_id) DESC")

电脑没装 MySQL 没验证过。

#3 楼 @Rei 嘿嘿,搭便车:请问下,SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons.LastName 如果来写?joins 能满足吗?

试试这个

Topic.group(:user_id).order('count_all').count

返回的是是一个 user_id - count_all 的 Hash,需要在 ruby 里根据 value 排序。

我试了试

Topic.group(:user_id).order('count_all desc').count

也能出来,打印出来似乎是按照 count_all 排序的(不解,Hash 不是无序的吗?)。我用的是 Ruby-1.9.3 和 Rails-3.2.8

我遇到这样的直接上 find_by_sql

#6 楼 @alvin2ye 我尽量不使用 find_by_sql,也不推荐新手用,因为不小心可能就会引起问题,比如注入什么的。

#4 楼 @ruby_sky

如果你的表名和字段名符合约定或者都设置好关联和表名的话可以这样

Person.joins(:orders).select(:LastName, :FirstName, :OrderNo).order("LastName")

#8 楼 @Rei thx。明天试试。

Topic.group('user_id').select('user_id').order('count(user_id) desc')

#10 楼 @woaigithub 嗯 可以实现, @sort=Topic.group('user_id').select('user_id').order('count(user_id) desc') 如何让@sort做为变量放进另一个查询中去,如:@users = User.find(@t) 这样写出错,提示:Cannot visit Topic

find 方法没有这种参数,你要找一个接受这种参数的方法。

#12 楼 @woaigithub 那如果我要根据这个 user_id 去找到所有 users 集合,该怎么写呢

不太明白,user_id 是唯一的,根据这个唯一的只能找到一个 user,不太可能找到一个集合吧

#14 楼 @woaigithub 奥,我说得不清楚,我意思是根据@sort 来得到对应 user_id 的返回记录,

你的意思是查询发表了 topic 的 user 列表,你想要的 user 列表,但是里面的 user 需要有 topic,然后根据 topic 的 count 倒序排列,是这样的吗?

#7 楼 @zhangyuan ?避免,不要拼接字符串

先写出 sql,然后再翻译成 rails 的 query interface。 强烈建议学习 sql 先,稍微复杂点的数据库应用都会用到的,这个也是基本功之一,必须比较扎实才行。

先说 sql 怎么写。 你这个最直观的是需要连接两张表,users 和 topics,inner join。 users inner join topics on users.id=topics.user_id 这样保证只查询发表过 topic 的 user。 然后根据 topic 的 user_id 分组,配需,然后查询 user 的信息。

或者是

select u from users u where exists( select 1 from topics t where t.user_id=u.id) .groupby .order

#18 楼 @woaigithub 嗯。就是这个意思。有同事喜欢用 find_by_sql,但拼接字符串的时候不 escape 让人担心啊

#19 楼 @woaigithub sql 理好了 SELECT * FROM users INNER JOIN(select user_id from topics group by user_id order by count(user_id) desc) g on g.user_id = id。find_by_sql 可以实现,那转换乘 rails 还是不会,用 joins 一直没成功过

需要 登录 后方可回复, 如果你还没有账号请 注册新账号