簡體   English   中英

Rails活動記錄-最近通過關聯更新

[英]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是否可行。 最終,我只需要專輯的titleid ,然后我就可以從那里構建所有我需要的東西。

最好的方法是什么?

數據庫是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM