如何加快AR查询速度

时间:2015-09-01 09:37:17

标签: sql ruby-on-rails ruby activerecord

让我们看看以下代码:

users = []

User.find_each do |u|
 author = u.articles.where('some where statement').limit(1).try(:author)
 users << { user: u.name, author: author }
end

users

问题是当我迭代每个用户并且Active Record调用DB时。

我已为includes尝试了articles,但它只加载了所有articles,然后从数据库中创建select,因为where, limit and author

任何想法如何避免多次调用DB,可能会以某种方式预加载articles整个条件?

2 个答案:

答案 0 :(得分:4)

据我所知,您需要每个用户一篇文章。所以,group by自然会浮现在脑海中。这些方面应该有用:

articles = Article.includes(:user, :author).where(your_where_condition).group(:user_id)
users = articles.map{|a| { user: a.user.name, author: a.author }}

答案 1 :(得分:0)

快速设置:

User.includes(articles: :author).joins(:articles).merge(Article.where('some where statement')).map do |u|
  { user: u.name, author: u.articles.first.author }
end

但是加载所有文章只能拿一个文章是没用的,所以如果'some where statement'被修复,你可以定义专用关系。