【问题标题】:Order by foreign key in activerecord: without a join?在activerecord中按外键排序:没有连接?
【发布时间】: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


【解决方案1】:

您希望在主动记录写作中实现的目标是

SELECT b.* from bids b inner join users u on u.id=b.user_id order by u.ranking desc

在活动记录中,我会写如下: Bids.joins("inner join users u on bids.user_id=u.id").order("u.ranking desc")

我认为这是唯一不从用户模型中获取所有属性的连接。

【讨论】:

  • +1 这就是我要使用的......但它有点不能回答这个问题,因为我特别说没有加入。仅出于这个原因,我将保留问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 2015-03-10
  • 2023-04-02
  • 2011-09-12
相关资源
最近更新 更多