AnApprentice
AnApprentice

Reputation: 110940

ActiveRecord Include, how to use in nested records?

I currently have the following:

@threads = current_user.threads.includes(:user, :thread_members)

I then take threads and do the following:

@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

The issue here is that every EACH loop, rails is hitting the DB for the same basic records. Rails sees to be caching as I see CACHE in the log but it's mighty messy. Leaves me wishing I could do some type of includes so there wasn't so many db requests.

Any ideas on how this can be optimized? Something around including all the users in one db hit?

Thanks

Upvotes: 0

Views: 648

Answers (1)

M. Cypher
M. Cypher

Reputation: 7066

If you don't want any DB queries in the loop, you have to define everything that's used there in the named associations that are included, so instead of a thread_members_active method you'd define a thread_members_active association which has the same behavior. Note that the association also needs to use includes on user. Can't give you more right now, but maybe that helps a bit.

Edit: Check out the "Eager loading of associations" part of this doc:

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

Upvotes: 1

Related Questions