将sql查询转换为ActiveRecord Rails

时间:2016-05-27 16:34:12

标签: mysql sql ruby-on-rails activerecord

我的数据库中有一个位置表,其中包含我系统所有用户的位置数据。

表格设计类似于

 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。有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:1)

我认为这会给出正确的结果:

for (int i = 0; i < bricksList.size(); i++) {
 BufferedImage image;
 try {

            image = ImageIO.read(new File(bricksList.get(i).img));

            g.drawImage(image, bricksList.get(i).x, bricksList.get(i).y, null); 
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }

如果要生成完全相同的查询,可以执行此操作:

MyModel.order(created_at: :desc).group(:user_id).distinct(:user_id)

我认为子查询可能无法很好地扩展到大型数据集,但我知道如果您只想将其转换为rails并稍后进行优化。

答案 1 :(得分:0)

如何添加范围,并以稍微不同的方式获得相同的结果:

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'])

...获取所需的数据集。