rails where()sql查询数组

ste*_*715 15 ruby ruby-on-rails ruby-on-rails-3

我会尽可能地解释这个.我对用户帖子有疑问:

@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
Run Code Online (Sandbox Code Playgroud)

基本上,我需要以上工作,以便它使用在selected_posts中发布帖子的用户,而不是我们数据库中的每个用户.

Har*_*tty 44

试试这个:

user.posts.where("posts.category = ?", "Baseball")
Run Code Online (Sandbox Code Playgroud)

编辑1:

user.posts.where("posts.id IN (?)", @selected_posts)
Run Code Online (Sandbox Code Playgroud)

编辑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")
Run Code Online (Sandbox Code Playgroud)


And*_*rew 9

只需使用以下内容:

User.find(@selected_posts.map(&:user_id).uniq)
Run Code Online (Sandbox Code Playgroud)

这将从所有选定的帖子中获取用户ID,将它们转换为数组,并删除任何重复项.将数组传递给用户只会找到具有匹配ID的所有用户.问题解决了.

要将此与您在问题中显示的内容相结合,您可以写:

@posts_matches = User.find(@selected_posts.map(&:user_id).uniq).map{ |user|
  [user.company_name, user.posts.size, user.username]
}
Run Code Online (Sandbox Code Playgroud)

使用size计数的关系,而不是count由于Rails缓存大小的方法和自动不会看它不止一次.这对性能更好.

不确定在查询结束时使用Array#sort尝试完成的任务,但您可以始终执行以下操作:

@users_with_posts_in_selected = User.find(@selected_posts.map(&:user_id).uniq).order('username DESC')
Run Code Online (Sandbox Code Playgroud)


jhl*_*lnd 5

我不明白你的问题,但你可以像这样将数组传递给 where 方法:

where(:id => @selected_posts.map(&:id))
Run Code Online (Sandbox Code Playgroud)

它将创建一个 SQL 查询,如 WHERE id IN (1,2,3,4)