Как отсортировать глубоко вложенные коллекции с ActiveRecord? - PullRequest
1 голос
/ 06 сентября 2011

Я создаю приложение 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 (по порядку).

Я пробовал несколько перестановок предложений order и group в области видимости, нони один из них не имел желаемого эффекта при заказе песен в контексте заказа альбомов.

Ответы [ 2 ]

2 голосов
/ 07 сентября 2011

вы пробовали:

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). Не используйте GROUP BY, это полезно только при генерации агрегатов (например, http://www.w3schools.com/sql/sql_groupby.asp)

0 голосов
/ 17 февраля 2016

Чтобы добавить к ответу m_x, если вы хотите, чтобы ваш код был более объектно-ориентированным, вы можете построить предложение order следующим образом:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...