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.