0

1レベル以上の深さの「order」ActiveRelation呼び出しに順序付けを含めるにはどうすればよいですか?

つまり、1レベルの深さしかない場合の答えを理解しています(関連データによってRailsの順序で質問および回答されます)。ただし、並べ替えるデータの深さが2レベルの場合があります。

具体的には、私のスキーマでは、SongbookEntryにアーティストと曲を含むレコーディングが含まれています。SongbookEntryリストを曲のタイトルで並べ替えられるようにしたい。

1レベル深くして、曲のタイトルで録音を並べ替えることができます。

@recordings = Recording.includes(:song).order('songs.title')

...しかし、2つのレベルを深くする方法がわかりません。さらに、レコーディング(つまり、曲のタイトルとアーティスト名)を並べ替えることができれば素晴らしいと思いますが、これはSQLに依存せずに可能ですか?

助けてくれてありがとう、

キース

4

3 に答える 3

0

「SQLに降りる」必要がないように、レコーディング自体にアーティスト名(および場合によっては曲のタイトルも)を保存することをお勧めします。

于 2012-10-29T08:13:17.213 に答える
0

この
  SongbookEntry.includes(:recording => [:artist、:song])。order('songs.title、artists.name')を試してください

ビューで関連するテーブルフィールドを使用したくない場合は、インクルードの代わりに結合を使用できます

于 2012-10-29T08:22:01.247 に答える
0

SongbookEntryとの間の関連付けをモデル化する場合Song

class SongbookEntry < ActiveRecord::Base
  # ...
  has_one :song, through: :recording
end

既存のスキーマにアクセス@songbookentry.songして使用できるようになります。SongbookEntry.joins(:song)

編集:

同じアイデアをArtistに適用すると、考えられるクエリは次のようになります。

SongbookEntry.joins(:song,:artist).order('songs.title','artists.name')

Rails風に見えても、これは最も効率的な操作(複数の結合が含まれる)ではない可能性があることに注意してください。後で、Ryanが提案したようにテーブルを非正規化するか、データをモデル化する別の方法を見つけることができます。

于 2012-10-29T08:22:13.267 に答える