Order by foreign key in activerecord: without a join?

假如想象 提交于 2019-12-12 02:29:19

问题


I want to expand this question. order by foreign key in activerecord

I'm trying to order a set of records based on a value in a really large table. When I use join, it brings all the "other" records data into the objects.. As join should..

#table users  30+ columns
#table bids  5 columns
record = Bid.find(:all,:joins=>:users, :order=>'users.ranking DESC' ).first

Now record holds 35 fields..

Is there a way to do this without the join?

Here's my thinking..
With the join I get this query

SELECT * FROM "bids" 
left join users on runner_id = users.id  
ORDER BY ranking LIMIT 1

Now I can add a select to the code so I don't get the full user table, but putting a select in a scope is dangerous IMHO.

When I write sql by hand.

SELECT * FROM bids 
order by (select users.ranking from users where users.id = runner_id) DESC
limit 1

I believe this is a faster query, based on the "explain" it seems simpler.
More important than speed though is that the second method doesn't have the 30 extra fields.
If I build in a custom select inside the scope, it could explode other searches on the object if they too have custom selects (there can be only one)


回答1:


What you would like to achieve in active record writing is something along

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

In active record i would write such as: Bids.joins("inner join users u on bids.user_id=u.id").order("u.ranking desc")

I think it's the only to make a join without fetching all attributes from the user models.



来源:https://stackoverflow.com/questions/29763012/order-by-foreign-key-in-activerecord-without-a-join

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!