让我们说,我有两种不同的模型;用户和帖子。我想获得每个用户的最新帖子。 所以输出就是这样的。
[<Post user_id:1, content:"yadayada" ....>, <Post user_id:2, content:"blabla"...> ......]
每个用户不超过一条记录是我感到困惑的部分。
我用Google搜索了一下,发现了复杂的活动记录查询来处理这个问题。我想知道是否有任何方法可以用简单的rails3.present? ? "rails3" : "rails"
方式。
感觉这不应该超过1行代码。 提前谢谢。
答案 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 }