2017-05-11 6 views
0

私の問題を示す仮説的状況:アーティストが「アルバム」を作成し、それらのアルバムに「曲」を追加できるウェブアプリを構築する。 ユーザーがアルバムにソングを広告するときに、そのアルバムを最近更新されたアルバムのリストに表示します。Rails Active Record - 最近更新されたアソシエイティブ

問題:可能であるとは思いますが、このクエリをActive Recordに書き込む方法が正確にはわかりません。

例:新しい曲がアルバムに追加された場合、このアルバムを結果セットに戻したいと思います。最終的に私が望む結果はアルバムのセットですが、そのセットは更新された子供の種類、つまり曲に依存します。

別の言い方をすれば、誰かがウェブページに来て、最近更新されたアルバムをすべて見ることができるようにする(更新は新しい曲がアルバムに追加されたときである)。

クラス:

class User < ActiveRecord::Base 
    has_many :songs 
end 

class Song < ActiveRecord::Base 
    belongs_to :user 
    has_many :album_songs 
    has_many :albums, :through => :album_songs 

    # has a release_date field too, which is when the song will be released. 
end 

class AlbumSong < ActiveRecord::Base 
    belongs_to :song 
    belongs_to :album 
end 

class Album < ActiveRecord::Base 
    has_many :album_song 
    has_many :songs, :through => :album_song 
end 

がどのように私は最近、彼らに追加​​リリースされた曲を持っていたすべてのアルバムを返すようにクエリを記述することができますか?リリースされた曲は、出てきた曲です< = NOW()。

その他の考慮事項ユーザーが3曲をアルバムに追加した場合、そのアルバムがリストに1回だけ表示されるようにします.3回ではなく、その曲がリリースされたときに表示されます。曲がまだリリースされていない場合、このコースは更新されたとして返されません。リリースされた曲が追加されるたびに、コースは '最近更新された'リストに移動します。したがって、私はこれに独特の何かを必要としている(私は思う)。

これはActiveRecordでは可能かどうかはわかりません。私は最終的にはtitleとアルバムのidが必要です。そしてそこから必要なものすべてを構築できます。

これを行うにはどうすればよいですか?

データベースは新曲が追加された後、アルバムのupdated_atのフィールドを更新するためにはPostgres

+0

概念質問あなたのアプリがあなたの 'ユーザを更新するために、それはokです。 updated_at'フィールドに曲が追加されたら? –

+0

@AlejandroMontillaいいえ、他のビジネス上の理由から、私たちはそれを更新できません。 –

+0

これを管理するために 'users'にカラムを追加することはオプションではありませんか? –

答えて

0

使用touchです:

Albums.order(updated_at: :desc).limit(10) 

class AlbumSong < ActiveRecord::Base 
    belongs_to :song 
    belongs_to :album, touch: true 
end 

その後、あなたは10、最近更新されたアルバムを取得するには、このクエリを使用することができます


更新

あなたがこの範囲を試すことができます(すでに解放されて)最後に追加された曲でソートされた10枚のアルバムを取得するには:ここで

class Album < ActiveRecord::Base 
    ... 

    scope :sorted_by_recent_song, -> { 
    joins(:albums_songs) 
    .where(' 
     albums_songs.updated_at = (
     SELECT MAX(albums_songs.updated_at) 
     FROM albums_songs 
     JOIN songs ON albums_songs.song_id = songs.id 
     WHERE albums_songs.album_id = albums.id 
     AND songs.release_date <= NOW() 
    ) 
    ') 
    .group(['albums.id', 'albums_songs.id']) 
    .order('albums_songs.updated_at DESC') 
    .limit(10) 
    } 
end 
+0

ああ、これはほとんどそれです。私は、曲クラスのrelease_dateフィールドにフィルタリングする必要があることを完全に忘れてしまった。私は私の質問を更新しました。しかし、ありがとう! –

+0

@DonnFelker私はちょうど私の答えを更新しました。あなたはそれを見ることができますか? :) –

+0

このクエリをそのまま実行すると、 'albums'からのfrom-clauseエントリが見つからないというエラーが表示されます。次の結合を追加すると、クエリは実行されますが、1つのレコードのみが返されます。 'JOIN albums ON albums_songs.album_id = albums.id' –

関連する問題