ActiveRecord包含,如何在嵌套记录中使用?

时间:2011-07-31 17:14:06

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

我目前有以下内容:

@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,但它非常混乱。让我希望我可以做一些类型的包含,所以没有那么多的数据库请求。

有关如何优化这一点的任何想法?包括所有用户在一个数据库命中的东西?

由于

1 个答案:

答案 0 :(得分:1)

如果您不想在循环中进行任何数据库查询,则必须定义所包含的命名关联中使用的所有内容,因此您需要定义{{1} thread_members_active方法而不是thread_members_active方法。具有相同行为的关联。请注意,关联还需要在includes上使用user。现在不能给你更多,但也许有点帮助。

编辑:查看此文档的“渴望加载关联”部分:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html