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)
只需使用以下内容:
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)
我不明白你的问题,但你可以像这样将数组传递给 where 方法:
where(:id => @selected_posts.map(&:id))
Run Code Online (Sandbox Code Playgroud)
它将创建一个 SQL 查询,如 WHERE id IN (1,2,3,4)
| 归档时间: |
|
| 查看次数: |
43800 次 |
| 最近记录: |