Rails 如何指定 id 数组,使用 where in 查询,然后利用指定的 id 数组排序?

junlai · 2012年05月03日 · 最后由 torvaldsdb 回复于 2016年12月07日 · 7761 次阅读

使用场景如ruby china中的我的收藏功能:
Topic.find(@user.favorite_topic_ids)
或者
Topic.where("id in (@user.favorite_topic_ids)")
请问如何才能让返回结果也能按照指定的favorite_topic_ids的顺序进行排序呢?

Topic.where("id in (?)",@user.favorite_topic_ids).order("id")

SELECT * FROM tablename WHERE id IN (1,10,8,5) ORDER BY FIND_IN_SET(id, '1,10,8,5')

Topic.find(@user.favorite_topic_ids).sort_by { |topic| @user.favorite_topic_ids.index(topic.id) }


1 楼,@ywencn 不是 id 排序,是 in 中指定的 favorite_topic_ids 数组

2 楼,@cactis 这个貌似只有 mysql 支持,我想知道 rails 的 active_record 中有没有抽象出来的方法

3 楼,@wx1452 如果数据量大,需要分页的话,这个就效率比较低了。需要每次把所有的收藏 id 都查出来,再排序。

你抽出来以后内存排序就是了,

首先开启 idendity_map

@topics = Topic.where("id in (@user.favorite_topic_ids)")
@user.favorite_topic_ids.each {|id| (@topics_ordered ||=[]) << Topic.find(id)}


由于开启了 idendity_map,不会有额外的查询

@junlai , 多谢,学习了!

#6 楼 @junlai 可以对@user.favorite_topic_ids分页,用分页结果取 topic,再排序。

ids = @user.favorite_topic_ids.join(",") Topic.where("id in (?)",ids).order("field(id #{ids})") 不知道这样可以吗

话说没有人觉得应该用关联来做嘛?

不建议使用 in,无法用到索引,性能不佳。

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