[英]Rails Active Record - Recently Updated Through Association
假設的情況證明了我的問題:構建一個網絡應用程序,使藝術家可以創建“專輯”並將“歌曲”添加到這些專輯。 當用戶在專輯中播放歌曲時,我希望該專輯顯示在最近更新的專輯列表中。
問題:我不確定該如何在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()發行的歌曲。
要考慮的其他事項。 如果用戶將三首歌曲添加到他們的專輯中,那么我只希望該專輯在列表中顯示一次,而不是三首(如果歌曲已發布)。 如果尚未發布歌曲,則查詢不應返回已更新的課程。 每次添加已發行的歌曲時,課程將在“最近更新”列表中上移。 因此,我需要一些獨特的東西(我認為)。
我不確定ActiveRecord是否可行。 最終,我只需要專輯的title
和id
,然后我就可以從那里構建所有我需要的東西。
最好的方法是什么?
數據庫是Postgres
添加新歌曲后,使用touch來更新Album的Updated_at字段:
class AlbumSong < ActiveRecord::Base
belongs_to :song
belongs_to :album, touch: true
end
然后,您可以使用此查詢來獲取10個最近更新的相冊:
Albums.order(updated_at: :desc).limit(10)
UPDATE
要獲得按最后添加的歌曲(已經發行)排序的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.