如何获取rails中每个用户的最新帖子

时间:2012-12-01 19:08:52

标签: ruby-on-rails ruby-on-rails-3 activerecord

让我们说,我有两种不同的模型;用户和帖子。我想获得每个用户的最新帖子。 所以输出就是这样的。

[<Post user_id:1, content:"yadayada" ....>, <Post user_id:2, content:"blabla"...> ......]

每个用户不超过一条记录是我感到困惑的部分。 我用Google搜索了一下,发现了复杂的活动记录查询来处理这个问题。我想知道是否有任何方法可以用简单的rails3.present? ? "rails3" : "rails"方式。

感觉这不应该超过1行代码。 提前谢谢。

2 个答案:

答案 0 :(得分:3)

看到我还没有发表评论,这里是渴望加载的答案:

N + 1问题意味着当您使用User.all查询所有用户时,ActiveRecord将无法获取帖子,因此ActiveRecord将触发一个新的SQL查询,为您迭代的每个用户选择最后一个帖子过度。如果您有50个用户,那么对于50个用户将是一个查询,然后是每个最后帖子的50个查询。

如果您有很多用户,数据库和Rails应用程序之间的延迟会降低网站的性能并让用户等待。

Eager loading允许您将关联模型提取到您要查询的模型,因此您可以写:

User.includes(:posts).all.map { |u| u.posts.last }

ActiveRecord将首先查询所有用户,然后在迭代用户之前一次查询与所有用户关联的所有帖子,从而避免为每个用户执行新查询。这只是两个问题。

然而,如果您的用户有大量帖子,这也有它的缺点,因为您将获取所有用户的所有帖子而不仅仅是最新帖子,从而使数据库紧张并产生大量不需要的I / O.

答案 1 :(得分:2)

posts = User.all.map { |u| u.posts.last }