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

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

假设我有 2 个不同的模型;用户和帖子。我想获取每个用户的最新帖子。 所以输出会是这样的。

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

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

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

最佳答案

由于我还不能发表评论,这里是急切加载的答案:

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

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

预加载允许您将关联模型获取到您正在查询的模型,因此您可以编写:

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

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

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

关于ruby-on-rails - 如何获取rails中每个用户的最新帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13662739/

相关文章:

ruby-on-rails - "Order by""group by"计数的结果?

ruby-on-rails - 带有新 Rails 应用程序的预先存在的数据库

ruby-on-rails - ruby on rails - 未定义的方法有效吗?

ruby - 使用 Rubymine 调试 Rails 应用程序时的堆栈跟踪

ruby-on-rails - 我什么时候应该在 gemfile 中使用 development vs testing group 来测试 gems?

ruby-on-rails - Rails 的 ActiveRecord 序列化 :attr method gives "Missing Class or module error"

ruby-on-rails - 如何解决 RubyMine "' ruby​​-debug-ide' isn't installed”错误

ruby-on-rails - 这个语法在 Ruby 中是什么意思? .. tasks.all?(& :complete? )

ruby-on-rails-3 - 错误 : migrate SQLite to Postgres

mysql - 如何组合 2 个 SQL 查询以获得 1 个结果