Rails - передача определенного столбца для запроса по количеству связанной модели - PullRequest
0 голосов
/ 11 июня 2019

У меня есть приложение rails с моделью "recipes".Рецепт может понравиться («нравится» модель) пользователю.Чего я хотел бы достичь (в конце концов), так это отсортировать список рецептов на странице указателей рецептов по количеству лайков.

Я видел множество тем, но две из них мне подсказали больше всего.были:

Рельсы 3 ActiveRecord: порядок и группировка по количеству ассоциаций

Порядок рельсов по количеству результатов ассоциации has_many

У меня так далеко, что у меня есть SQL-запрос, который выдает список рецептов с подсчетом их лайков:

SELECT recipes.name, COUNT(likes.id)
FROM recipes
LEFT JOIN likes on recipes.id = likes.recipe_id
GROUP BY recipes.name
ORDER BY COUNT(likes.id) DESC;

Однако, когда «переводя» его на что-то, что ActiveRecord может понять, яЯ столкнулся с проблемами.

Я пришел к выводу, что использование Recipe.joins (: likes) или Recipe.left_joins (: likes) пропускает все столбцы, указанные в «recipes», что приводит к следующей ошибке:

"Столбец" recipes.id "должен появляться в предложении GROUP BY или использоваться в статистической функции ...".

Теперь, когда мне нужно передать recipes.name и COUNT (лайки.id) только я использовал select:

Recipe.select("recipes.name, COUNT(likes.id)").joins(:likes).group("recipes.name").order("COUNT(likes.id) DESC")

e Я застрял, поскольку он производит это:

ActiveRecord :: Relation [Идентификатор рецепта: ноль, имя: "Яичница-болтунья", Идентификатор рецепта: ноль, имя: "Суп", Идентификатор рецепта: ноль, имя: "Блинчики Nutella"]

Ответы [ 2 ]

1 голос
/ 11 июня 2019
Recipe.joins("LEFT JOIN likes ON recipes.id = likes. recipe_id").group("recipes.id").order("COUNT(likes.id) ASC")

При анализе ActiveRecord ожидается, что возвращенный набор результатов будет иметь столбцы, которые имеет исходная модель (или подмножество столбцов).

При выборе подмножества исходных столбцов ActiveRecord обнуляет все остальные столбцыпри разборе его в объекте / отношении ActiveRecord

0 голосов
/ 11 июня 2019

Ваш запрос правильный. Обратите внимание, что используется класс модели Recipe, который не содержит настраиваемое поле в своем классе. Если ваш запрос

Recipe.select("COUNT(likes.id)").joins(:likes).group("recipes.name").order("COUNT(likes.id) DESC")

Это покажет вам

ActiveRecord::Relation [Recipe id: nil, Recipe id: nil, Recipe id: nil]

Тем не менее, вы по-прежнему можете получить доступ к вашим настраиваемым полям, возвращенные данные хранят его для использования. Вам просто нужно дать ему имя, чтобы позвонить. Кроме того, вы можете использовать это поле для заказа, пожалуйста, не направляйте заказ COUNT

recipes = Recipe.select("COUNT(likes.id) as total_likes").joins(:likes).group("recipes.name").order("total_likes DESC")
recipe.first.total_likes # TOTAL LIKE of first recipe
...