2009-03-13 5 views
4

モデルX has_many YsとモデルY belongs_to Xを仮定します。各Yにはデータベースに挿入された日付があります。さて、すべてのXと熱心な負荷を最後のYをそれぞれのXにロードすることは可能です(各XにはYのbazzilionsがあるので最後のもののみ)。最後の従属レコードをロードしようとしています

答えて

4

はい、

ソングに新しい関連付けを追加します。この例に

class Song < ActiveRecord::Base 
    has_many :votes 
end 

class Vote < ActiveRecord::Base 
    belongs_to :song 
end 

てみましょう:

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

この新しい協会は常にソングのための最も最近作成した投票を返します。 。熱心な負荷それに

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

そのクエリによって生成された結合を調べることは興味深いでしょう。 :)ビットを非正規化し、Songにlast_vote_idというフィールドを追加するのが最善でしょう。新しい投票が追加されるたびに更新されます。ちょうど:include =>:last_vote以降、不要なデータのロード(またはスマートの場合はGROUP BY)が必要です。 – vladr

+0

真、私の上記のコードは完全にテストされていません。 Vlad、あなたのソリューションは私のものに勝るもののように聞こえる。 – Tilendor

+0

これは、最初の曲だけでなく、各曲のすべての投票をプリロードします。これにより、 SELECT "votes"のようなクエリが生成されます。* FROM "votes" WHERE "votes"。 "song_id" IN(1,2,3,4,5)order by created_at DESC –

0

以前のソリューションは本当に素晴らしいです!しかし、私はもう一つの特徴を探しています:特定の日付の前に最後の従属レコードを読み込むことは可能でしょうか?これは、ユーザーが曲の投票履歴を閲覧できるようにするためです(前日と翌日へのリンクがあります)。

関連する問題