【发布时间】:2015-06-28 01:42:49
【问题描述】:
我想扩展这个问题。 order by foreign key in activerecord
我正在尝试根据一个非常大的表中的值对一组记录进行排序。 当我使用连接时,它会将所有“其他”记录数据带入对象中。作为连接应该......
#table users 30+ columns
#table bids 5 columns
record = Bid.find(:all,:joins=>:users, :order=>'users.ranking DESC' ).first
现在记录包含 35 个字段..
有没有办法在没有加入的情况下做到这一点?
这是我的想法..
通过加入,我得到了这个查询
SELECT * FROM "bids"
left join users on runner_id = users.id
ORDER BY ranking LIMIT 1
现在我可以在代码中添加一个选择,这样我就不会得到完整的用户表,但是将一个选择放在一个范围内是危险的恕我直言。
当我手工编写 sql 时。
SELECT * FROM bids
order by (select users.ranking from users where users.id = runner_id) DESC
limit 1
我相信这是一个更快的查询,基于“解释”它似乎更简单。
不过,比速度更重要的是第二种方法没有 30 个额外的字段。
如果我在范围内构建自定义选择,如果对象也有自定义选择(只能有一个),它可能会爆炸对象上的其他搜索(只能有一个)
【问题讨论】:
-
我最终决定的。 scope :order_by_ranking, -> { order('(select ranking from users where users.id = runner_id) DESC') }
-
EXPLAIN 向您显示将使用的查询计划,它不会告诉您任何有关性能的信息:它可能是一个糟糕的查询计划.... 使用 EXPLAIN ANALYZE 获取有关性能和内存使用情况的信息.
-
当前版本的 Rails 是否默认选择为出价。* 在这种情况下?您的第二个查询看起来必须为每一行运行子查询,这会很慢
标签: ruby-on-rails postgresql join activerecord