![](/img/trans.png)
[英]Converting complicated SQL query into Rails ActiveRecord expression
[英]Converting sql query to ActiveRecord Rails
我的数据库中有一个位置表,其中包含系统所有用户的位置数据。
桌子的设计有点像
id| user_id| longitude| latitude| created_at|
我有很多用户。 现在,我要选择所有这些用户的最新(按创建位置排序)位置。
我能够找出相同的SQL查询
SELECT * FROM my_table
WHERE (user_id , created_at) IN (
SELECT user_id, MAX(created_at)
FROM my_table
GROUP BY user_id
)
AND user_id IN ('user1', 'user2', ... );
现在,当我在Ruby On Rails中工作时,我想将此SQL查询写到activerecord rails。 有人可以帮我吗?
我认为这将给出正确的结果:
MyModel.order(created_at: :desc).group(:user_id).distinct(:user_id)
如果要生成完全相同的查询,可以这样做:
MyModel.where("(user_id, created_at) IN (SELECT user_id, MAX(created_at) from my_table GROUP BY user_id)")
我认为子查询可能无法很好地处理大型数据集,但是我知道您是否只想使其陷入困境并在以后进行优化。
如何添加范围并以略有不同的方式获得相同的结果:
class UserLocation
def self.latest_per_user
where("user_locations.created_at = (select Max(ul2.created_at) from user_locations ul2 where ul2.user_id = user_locations.user_id)")
end
end
然后,您只需使用:
UserLocation.latest_per_user.where(:user_id => ['user1', 'user2'])
...以获取所需的数据集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.