0

想象一个留言板,其中User每个has_many Posts。

我有一个范围可以返回一堆Posts,而我想做的是从那里转到一组Users。

我可以遍历,并且对于每个Post,将其添加User到关系中,然后对Users 进行重复数据删除,但必须有一种更简单的方法,不是吗?

4

2 回答 2

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

这样您就不必每次尝试从帖子中获取用户时都进行查询。

于 2013-11-01T23:59:28.957 回答
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")
于 2013-11-02T00:03:15.073 回答