2012-12-01 67 views
2

比方说,我有2个不同的模型;用户和发布。我想获取每个用户的最新帖子。 所以输出将是这样的。如何获取每个用户在rails中的最新帖子

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

每个用户不超过一条记录就是我一点困惑的部分。 我GOOGLE了这一点,并找到复杂的活动记录查询来处理这个。我想知道是否有任何方式在简单的rails3.present? ? "rails3" : "rails"方式。

感觉这应该不会超过1行代码。 在此先感谢。

回答

2
posts = User.all.map { |u| u.posts.last } 
+0

干净,很好,谢谢洛根! – whizzkid

+0

虽然有* N + 1个问题*。你最好使用一些*急切的加载*。 – jdoe

+0

@ jdoe:你是什么意思,你能举例说明吗? – whizzkid

2

看到,因为我还不能发表评论,这里就是答案预先加载:

的N + 1问题是指的ActiveRecord不会得到的职位,当您查询使用User.all所有用户,因此ActiveRecord会启动一个新的SQL查询,为每个遍历的单个用户选择最后一篇文章。如果您有50个用户,那么这将是50个用户的一个查询,然后是每个最后一个帖子的50个查询。

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

预先加载允许您关联模型获取到要查询的模式,所以你可以写:所有用户

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

的ActiveRecord会先查询,然后查询所有相关联的所有帖子用户在迭代用户之前一次,从而避免为每个用户做一个新的查询。这只是两个查询。

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

相关问题