想象一下留言板User
每个has_many
Post
s。
我有一个范围让我回复了一堆Post
s,而我想要做的就是从那里开始到User
s。
我可以迭代,对于每个Post
,将其User
添加到关系中,然后重复删除User
,但必须有一个更简单的方法,不是吗? / p>
答案 0 :(得分:1)
Posts.where('created_at>?',Time.now - 1.day).map(&:user).uniq
帖子查询将返回一组帖子。您需要将这些帖子映射到用户,然后将该集合截断为唯一用户(因为帖子可能属于同一个用户)。
急切加载:
Posts.where('created_at>?',Time.now - 1.day).includes(:user).map(&:user).uniq
这样,您每次尝试从帖子中提取用户时都不必进行查询。
答案 1 :(得分:1)
你必须加入这两个表:在我的例子中,我假设你想获得过去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")