我目前有以下内容:
@threads = current_user.threads.includes(:user, :thread_members)
然后我接受线程并执行以下操作:
@threads.each do |thread|
thread_members = thread.thread_members_active(current_user)
@threadList << {
:id => thread.id,
:uuid => thread.uuid,
:user_id => thread.user.id,
:last_activity_at => thread.last_activity_at,
:user_count => thread_members.length,
:user_photos => thread_members.collect { |thread_member|
{
:id => thread_member.user.id,
:photo => thread_member.user.photo(:thumb),
:name => thread_member.user.full_name
}
},
:caption => thread.caption
}
end
这里的问题是每个EACH循环,rails都会在数据库中找到相同的基本记录。 Rails看起来是缓存,因为我在日志中看到了CACHE,但它非常混乱。让我希望我可以做一些类型的包含,所以没有那么多的数据库请求。
有关如何优化这一点的任何想法?包括所有用户在一个数据库命中的东西?
由于
答案 0 :(得分:1)
如果您不想在循环中进行任何数据库查询,则必须定义所包含的命名关联中使用的所有内容,因此您需要定义{{1} thread_members_active
方法而不是thread_members_active
方法。具有相同行为的关联。请注意,关联还需要在includes
上使用user
。现在不能给你更多,但也许有点帮助。
编辑:查看此文档的“渴望加载关联”部分:
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html