2014-11-23 5 views
0

나는 Galleryhas_manyMediaItem입니다. 각각은 has_oneVideo 또는 Photo입니다. 나는 현재 다음 쿼리를 사용하고열역학적 부하 최적화

:

MediaItem.includes(gallery: {media_items: [:photo, :video]}).featured.rank(:position_in_featured) 

그러나 미디어 항목은 이제까지 Video 또는 Photo있을 것이라는 점을 주어, 나는 항상 '아무튼 중 사용되지 않은 열망 부하 남아 있어요 있다.

이 불필요한 포함을 피하기 위해 더 효율적인 쿼리 방법이 있습니까?

참고 : Polymorphic 연관을 포함하는 솔루션이 필요하지 않습니다. 이 경우 그들은 다른 쿼리에 너무 많은 복잡성을 초래하고 데이터 모델에 적합하지 않습니다.

답변

1

이 아마 polymorphic 관계 데이터 모델을 변경하고 유형을 media_content_idmedia_content_type 열을 가질 필요가 작동이 들어

class MediaItem < ActiveRecord::Base 
    belongs_to :media_content, :polymorphic => true 
end 

class Photo < ActiveRecord::Base 
    has_many :media_items, :as => :media_content 
end 

class Video < ActiveRecord::Base 
    has_many :media_items, :as => :media_content 
end 

MediaItem.includes(gallery: {media_items: [:media_content]}).featured.rank(:position_in_featured) 

MediaItembelongs_to 연결을 사용하는 것입니다 할 수있는 가장 좋은 방법 MediaItem에 있습니다.

편집 : 열망 로딩이 섹션의 마지막 단락에 경우에 작동해야하는 문서의 경우에도 주석이 : 불행하게도 다형성 연관을 사용

+0

쿼리에 너무 많은 복잡성을 제공 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Eager+loading+of+associations가 - 나는 표시해야 MediaItem의 정렬 된 목록과 별도의 모델을 가지고 있으면 많은 복잡성이 추가됩니다. MediaItem은 또한 사진이나 비디오와 절대적으로 관련이없는 상당한 양의 데이터를 전달합니다. 나는 모델을 집중시키고 이산 적으로 유지하는 것을 선호한다. – Undistraction

+0

다형성 연관의 열심히로드를 강조해 주셔서 감사합니다. 최근에 변경된 것 같습니다. – Undistraction

+0

Appart에서 다형성 관계를 사용하면 두 모델을 쿼리하여 사용 가능한 일부 레코드가 있는지 알아야하기 때문에 두 가지 쿼리없이이 작업을 수행 할 수 없습니다. –