我有以下内容:
@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一遍又一遍地重复上述请求,一遍又一遍地查找相同的记录。关于如何优化这一点的任何想法?
由于
答案 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