私は音楽を管理する Rails アプリを作成しています。このアプリのユーザーは、アルバムの順序付けられたプレイリストを作成でき、各アルバムには順序付けられた曲のリストが含まれます。
本質的に、これは次のようになります。
class User < ActiveRecord::Base
has_many :playlists, :order => "position"
has_many :albums, :through => :playlists
end
class Playlist < ActiveRecord::Base
belongs_to :user
belongs_to :album
end
class Album < ActiveRecord::Base
has_many :songs, :order => "position"
has_many :playlists
end
class Song < ActiveRecord::Base
belongs_to :album
end
(私は、曲とプレイリストのテーブルacts_as_list
の列を使用してposition
、曲とプレイリストの並べ替え順序をそれぞれ管理しています。)
ここで、特定のユーザーのすべての曲のリストを (順番に) 見つけたいと思います。このスコープをSongモデルに追加すると、次のようになります。
scope :for_user, lambda{|user|
joins(:album => {:playlists => :user}).
where(:'users.id' => user.id)
}
私はそれを行うことができますが、返されたレコードは整理されていません。代わりに、各曲を最初にユーザーのアルバムのプレイリストの位置で並べ替え、次にそのアルバム内の曲の位置で並べ替えたいと思います。つまり、ユーザーがアルバム A、B、C を順番に再生したい場合、A のすべての曲 (アルバムにある順序で) と B のすべての曲の配列を探しています。 (順番に)、プラスCからのすべての曲(順番に)。
スコープ内の順序句とグループ句のいくつかの順列を試しましたが、アルバムの順序付けのコンテキスト内で曲を順序付けするという望ましい効果はありませんでした。