Как использовать ActiveRecord INCLUDES при зацикливании объекта - PullRequest
0 голосов
/ 26 августа 2011

У меня есть следующее:

@rooms = current_user.rooms

Затем мне нужно построить объект JSON, поэтому я делаю:

render :json => room_json_index(@rooms)

Затем, чтобы построить объект JSON:

def room_json_index(rooms)

    @roomList = Array.new

    rooms.each do |room|
      @roomList << {
        :id => room.id,
        :user_id => room.user_id,
        :user_count => room_members.length,
        :user_photos => room_members.collect { |room_member|
          {
            :id => room_member.user.id,
            :photo => room_member.user.photo(:thumb),
            :name => room_member.user.full_name
          }
        }
      }
    end

    @roomList.to_json
end

Проблема здесь в том, что в каждом цикле rooms.each рельсы продолжают получать данные для одних и тех же пользовательских объектов. Это необходимо? Я вижу в журналах, что это кеширование, но я бы предпочел, чтобы рельсы даже не думали об этом.

  roomMember Load (1.1ms)  SELECT "room_members".* FROM "room_members" INNER JOIN "users" ON "users"."id" = "room_members"."user_id" WHERE ("room_members".room_id = 143) AND (users.guest = false OR users.guest = true AND users.fname IS NOT NULL OR users.id = 3)
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 3 LIMIT 1
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 69 LIMIT 1
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 70 LIMIT 1
Room

Rails в журналах повторяет запрос выше и снова, просматривая одни и те же записи снова и снова. Любые идеи о том, как это можно оптимизировать?

Спасибо

1 Ответ

3 голосов
/ 26 августа 2011

кажется, что ваша модель данных похожа на

class User << AR::Base
   has_many :room_members
   has_many :rooms,:through=>:room_members,:include=>:users
   ......
end
class Room << AR::Base
   has_many :room_members
   has_many :users,:through=>:room_members
   ......
end
class RoomMember << AR::Base
   belongs_to :room 
   belongs_to :user 
   ......
end

, вы можете загрузить пользователя при загрузке комнаты

class User << AR::Base
   has_many :room_members
   has_many :rooms,:through=>:room_members,:include=>:users
   ......
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...