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

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

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

共收到 22 条回复
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一直没成功过

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