2013-08-23 3 views
0

Вот код:Rails: перечислимые # group_by с делегацией делает слишком много DB вызывает

class Video < ActiveRecord::Base 
    delegate :name, :to => :video_type, :prefix => true, :allow_nil => true 
    belongs_to :athlete, :class_name => "Athlete" 
end 

class Athlete < User 
    has_many :videos 
end 

консоль:

a = Athlete.last 
a.videos.group_by(&:video_type_name) 
    VideoType Load (0.8ms) SELECT "video_types".* FROM "video_types" WHERE "video_types"."id" = 12 LIMIT 1 
Called from: app/models/video.rb:9:in `video_type_name' 
    VideoType Load (0.9ms) SELECT "video_types".* FROM "video_types" WHERE "video_types"."id" = 14 LIMIT 1 
Called from: app/models/video.rb:9:in `video_type_name' 
    VideoType Load (0.8ms) SELECT "video_types".* FROM "video_types" WHERE "video_types"."id" = 1 LIMIT 1 
Called from: app/models/video.rb:9:in `video_type_name' 
    VideoType Load (0.7ms) SELECT "video_types".* FROM "video_types" WHERE "video_types"."id" = 9 LIMIT 1 
Called from: app/models/video.rb:9:in `video_type_name' 
    VideoType Load (0.7ms) SELECT "video_types".* FROM "video_types" WHERE "video_types"."id" = 11 LIMIT 1 
Called from: app/models/video.rb:9:in `video_type_name' 
    VideoType Load (0.8ms) SELECT "video_types".* FROM "video_types" WHERE "video_types"."id" = 2 LIMIT 1 
Called from: app/models/video.rb:9:in `video_type_name' 
    VideoType Load (0.8ms) SELECT "video_types".* FROM "video_types" WHERE "video_types"."id" = 2 LIMIT 1 

Есть ли способ уменьшить это только один вызов базы данных?

+1

Есть ли 'Видео'' принадлежит_to: video_type'? Попробуйте использовать 'a.videos.includes (: video_type) .group_by (&: video_type_name)' – akhanubis

ответ

0

Попробуйте использовать includes или join. Это создало бы запрос SQL, который создавал бы соединения между таблицами и группой по вашему желанию.

a.includes(:videos => :video_types).group('video_types.video_type_name') 
Смежные вопросы