想象一个留言板,其中User
每个has_many
Post
s。
我有一个范围可以返回一堆Post
s,而我想做的是从那里转到一组User
s。
我可以遍历,并且对于每个Post
,将其添加User
到关系中,然后对User
s 进行重复数据删除,但必须有一种更简单的方法,不是吗?
想象一个留言板,其中User
每个has_many
Post
s。
我有一个范围可以返回一堆Post
s,而我想做的是从那里转到一组User
s。
我可以遍历,并且对于每个Post
,将其添加User
到关系中,然后对User
s 进行重复数据删除,但必须有一种更简单的方法,不是吗?
Posts.where('created_at > ?', Time.now - 1.day).map(&:user).uniq
帖子查询将返回一组帖子。您需要将这些帖子映射到用户,然后将集合截断为唯一用户(因为帖子可能属于同一用户)。
急切加载:
Posts.where('created_at > ?', Time.now - 1.day).includes(:user).map(&:user).uniq
这样您就不必每次尝试从帖子中获取用户时都进行查询。
您必须加入这两个表:在我的示例中,我假设您想要获取过去 24 小时内发布的所有用户名:
# joining posts with users
Post.joins(:user)
# filtering all posts that are older than 1 day
.where("posts.created_at > ?", Time.now - 1.day)
# selecting every user only once
.select("users.id").uniq
# then selecting the fields you want to work with
.select("users.name")