2009-03-13 4 views
4

모델 X has_many Ys 및 모델 Y belongs_to X가 있다고 가정합니다. 각 Y에는 데이터베이스에 삽입 된 날짜가 있습니다. 이제 모든 X와 열의 부하를 마지막 Y로로드 할 수 있습니까? 각 X에는 Y의 bazzilions가 있기 때문에 마지막 X 만로드 할 수 있습니까?Eager 마지막 ​​하위 레코드로드 중

has_one :last_vote, :class_name => 'Vote', :order => 'created_at DESC' 

이 새로운 연관이 항상 곡에 가장 최근에 생성 된 응답을 반환합니다

답변

4

예는,

class Song < ActiveRecord::Base 
    has_many :votes 
end 

class Vote < ActiveRecord::Base 
    belongs_to :song 
end 

이 노래에 새로운 연결을 추가 예를 취할 수 있습니다 . 열망로드 그것에

:

songs = Song.find(:all, :conditions => 'artist_name = "frank"', :include => :last_vote) 
+1

해당 쿼리에서 생성 된 조인을 보는 것은 흥미로울 것입니다. :) 조금 비정규 화하고 Song에 필드를 추가하는 것이 가장 좋습니다. last_vote_id는 새 투표가 추가 될 때마다 업데이트됩니다. 그냥 : include => : last_vote 이후에, 불필요한 데이터로드 (또는 스마트 인 경우 GROUP BY)가 필요하지 않습니다. – vladr

+0

사실, 위의 코드는 완전히 테스트되지 않았습니다. 블라드, 당신의 솔루션은 내 것보다 개선 된 것처럼 들립니다. – Tilendor

+0

첫 번째 송뿐만 아니라 각 송에 대한 모든 투표를 미리로드합니다. 이것은 SELECT "votes"와 같은 쿼리를 생성합니다. * FROM "votes"WHERE "votes". "song_id"IN (1,2,3,4,5) order by created_at DESC –

0

이전 솔루션은 정말 위대하다! 그러나, 나는 한 가지 더 많은 기능을 찾고있다 : 특정 날짜 이전에 가장 부하가 적은 마지막 레코드를로드 할 수 있는가? 이것은 내 사용자가 노래의 투표 기록을 탐색 할 수 있도록하기 위해 필요합니다 (이전 및 다음 날짜 링크가 있음).

관련 문제