如何在循环对象时使用ActiveRecord的INCLUDES

时间:2011-08-26 03:19:51

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

我有以下内容:

@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

这里的问题是,在每个房间循环中,rails会不断地搜索相同用户对象的数据。这是必要的吗?我在日志中看到它是缓存但是我甚至不想考虑它。

  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 个答案:

答案 0 :(得分:3)

似乎您的数据模型就像

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