rails where() sql query в массиве
Я объясню это как можно лучше. У меня есть запрос на сообщения пользователя:
@selected_posts = Posts.where(:category => "Baseball")
Я хотел бы написать следующее утверждение. Здесь он находится в псевдо-терминах:
User.where(user has a post in @selected_posts
)
Имейте в виду, что у меня есть много разных настроек отношений, поэтому post.user
можно использовать.
Есть идеи?
/РЕДАКТИРОВАТЬ
@posts_matches = User.includes(@selected_posts).map{ |user|
[user.company_name, user.posts.count, user.username]
}.sort
В принципе, мне нужно, чтобы вышеуказанное работало так, чтобы оно использовало пользователей, которые HAVE размещают в selected_posts, а не КАЖДЫЙ пользователь, который у нас есть в нашей базе данных.
Ответы
Ответ 1
Просто используйте следующее:
User.find(@selected_posts.map(&:user_id).uniq)
Это приводит к идентификаторам пользователя из всех выбранных сообщений, превращает их в массив и удаляет любые дубликаты. Передача массива пользователю просто найдет всех пользователей с соответствующими идентификаторами. Задача решена.
Чтобы совместить это с тем, что вы показали в своем вопросе, вы можете написать:
@posts_matches = User.find(@selected_posts.map(&:user_id).uniq).map{ |user|
[user.company_name, user.posts.size, user.username]
}
Используйте size
для подсчета отношения вместо count
потому что Rails кэширует метод размера и автоматически не будет искать его более одного раза. Это лучше для производительности.
Не уверен, что вы пытались выполнить с помощью Array # sort в конце вашего запроса, но вы всегда можете сделать что-то вроде:
@users_with_posts_in_selected = User.find(@selected_posts.map(&:user_id).uniq).order('username DESC')
Ответ 2
Попробуй это:
user.posts.where("posts.category = ?", "Baseball")
Изменить 1:
user.posts.where("posts.id IN (?)", @selected_posts)
Изменить 2:
User.select("users.company_name, count(posts.id) userpost_count, user.username").
joins(:posts).
where("posts.id IN (?)", @selected_posts).
order("users.company_name, userpost_count, user.username")
Ответ 3
Я не понимаю ваш вопрос, но вы можете передать массив методу where следующим образом:
where(:id => @selected_posts.map(&:id))
и он создаст SQL-запрос типа WHERE id IN (1,2,3,4)
Ответ 4
В силу ваших ассоциаций ваши избранные должности уже имеют пользователей:
@selected_posts = Posts.where("posts.category =?", "Baseball")
@users = @selected_posts.collect(&:user);
Вероятно, вы захотите удалить дубликатов пользователей из @users.