1

私は音楽を管理する 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からのすべての曲(順番に)。

スコープ内の順序句とグループ句のいくつかの順列を試しましたが、アルバムの順序付けのコンテキスト内で曲を順序付けするという望ましい効果はありませんでした。

4

2 に答える 2

2

やってみました:

scope :for_user, lambda{|user|
  joins(:album => {:playlists => :user}).
  where('users.id' => user.id).
  order('"albums"."position" ASC, "songs"."position" ASC')
}

ORDER BY sql句は、複数の引数を受け入れます(http://www.quackit.com/sql/tutorial/sql_order_by.cfmを参照)。GROUPBYは使用しないでください。集計を生成する場合にのみ役立ちます(例:http://www.w3schools.com/sql/sql_groupby.asp

于 2011-09-07T07:54:39.053 に答える
0

m_x の回答に追加するには、コードをよりオブジェクト指向にしたい場合は、次のように順序句を作成できます。

order(Album.arel_table[:position], Song.arel_table[:position])

于 2016-02-17T00:39:42.163 に答える