ActiveRecord Включите, как использовать во вложенных записях? - PullRequest
0 голосов
/ 31 июля 2011

В настоящее время у меня есть следующее:

@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

Проблема здесь в том, что каждый КАЖДЫЙ цикл, рельсы, попадает в DBдля тех же основных записей.Rails видит, что кешируется, поскольку я вижу CACHE в журнале, но он очень грязный.Оставляю меня, желая, чтобы я мог сделать некоторые типы включений, чтобы не было так много запросов к БД.

Есть идеи о том, как это можно оптимизировать?Что-то вокруг, включая всех пользователей в один удар по дб?

Спасибо

1 Ответ

1 голос
/ 31 июля 2011

Если вам не нужны какие-либо запросы к БД в цикле, вы должны определить все, что там используется, в именованных ассоциациях, которые включены, поэтому вместо метода thread_members_active вы должны определить ассоциацию thread_members_active, котораяимеет такое же поведение.Обратите внимание, что для ассоциации также необходимо использовать includes на user.Не могу дать вам больше прямо сейчас, но, может быть, это немного поможет.

Редактировать: Посмотрите часть "Стремительная загрузка ассоциаций" этого документа:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...