让我们看看以下代码:
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
整个条件?
答案 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'
被修复,你可以定义专用关系。