Как преобразовать этот SQL-запрос в Rails Active Record? - PullRequest
0 голосов
/ 11 сентября 2018

У меня следующий запрос:

SELECT * FROM users 
JOIN locations 
ON locations.id = (
    SELECT id from locations 
    WHERE locations.user_id = users.id 
    ORDER BY locations.created_at 
    desc LIMIT 1
)

И это в основном означает, что у меня есть 2 модели (Пользователь, Местоположение), в которых Пользователь имеет_меня Местоположения.

Результат, который я ожидаю получить: для каждого пользователя я хочу получить его последнее местоположение.

Как я могу сделать это, используя только ActiveRecord?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Вы можете создать has_one ассоциацию

class User
  has_one :last_location, -> { order 'created_at DESC' }, class_name: "Location"
end

Тогда вы можете сделать

users = User.includes(:last_location)
users.each { |u| u.last_location; ... }
0 голосов
/ 11 сентября 2018

Вы можете попробовать это:

 User.where("id in (SELECT user_id from locations l 
        INNER JOIN users u ON u.id = l.user_id ORDER BY l.created_at desc LIMIT 1)")
0 голосов
/ 11 сентября 2018

Я думаю, что самое простое, что вы могли бы сделать, это добавить область действия в вашу модель Location, чтобы вернуть самое последнее местоположение.

Хотя это и не дает того же SQL, что вы написали вручную, оно должно давать те же результаты.

location.rb

scope :most_recent, -> { order(created_at: :desc).limit(1) }

Тогда что-то вроде:

user = User.last
user.locations.most_recent

Это должно дать вам этот вывод SQL, который вернет самое последнее созданное местоположение для пользователя.

SELECT  "locations".* FROM "locations" WHERE "locations"."user_id" = $1  ORDER BY "locations"."created_at" DESC LIMIT 1
...