Rails 4 ActiveRecord: порядок записи по атрибуту и ​​ассоциации, если он существует - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть три модели, которые у меня возникают проблемы при заказе:

User(:id, :name, :email)
Capsule(:id, :name)
Outfit(:id, :name, :capsule_id, :likes_count)
Like(:id, :outfit_id, :user_id)

Я хочу получить все Outfits, которые принадлежат Capsule и упорядочить их по likes_count.Это довольно тривиально, и я могу получить их так:

Outfit.where(capsule_id: capsule.id).includes(:likes).order(likes_count: :desc)

Однако я хочу также заказать наряды так, чтобы, если определенному пользователю это понравилось, оно выглядело вышев списке.

Пример, если у меня есть следующие записи об экипировке:

Outfit(id: 1, capsule_id: 2, likes_count: 1)
Outfit(id: 2, capsule_id: 2, likes_count: 2)
Outfit(id: 3, capsule_id: 2, likes_count: 2)

И указанному пользователю понравился наряд только с идентификатором 3, возвращаемым заказом должны быть идентификаторы: 3, 2, 1

Я уверен, что это довольно легко, но я не могу этого понять.Любая помощь будет принята с благодарностью:)

1 Ответ

0 голосов
/ 03 декабря 2018

Postgres SQL с подзапросом

SELECT outfits.* 
FROM outfits 
LEFT OUTER JOIN (SELECT likes.outfit_id, 1 AS weight 
                 FROM likes 
                 WHERE likes.user_id = @user_id) AS user_likes 
ON user_likes.outfit_id = outfits.id 
WHERE outfits.capsule_id = @capsule_id 
ORDER BY user_likes.weight ASC, outfits.likes_count DESC;

Postgres придает NULL-значениям больший вес при оформлении заказа.Я не уверен, как это будет выглядеть в запросе Ареля.Вы можете попробовать конвертировать его, используя эти шпаргалки .

...