0

次のコードを検討してください。

class Sheet
    has_many :songs
end

class Song
    belongs_to :sheet
end

sheet = Sheet.find(1)
sheet.songs << Song.find(5)
sheet.songs << Song.find(10)
sheet.songs << Song.find(8)

ここでの問題は、以下のコードを実行すると、そのシートの曲のリストが返されますが、(5,10,8) で追加した順序と同じではないことです。それは実際に によって注文された曲を提供してくれますname

songs = Sheet.find(1).songs

曲の最初の順序を維持するにはどうすればよいですか?

4

2 に答える 2

3

デフォルトの順序を設定するには、いくつかの操作を行うことができます。

オプション a)

class Sheet
    has_many :songs, :order => 'songs.id DESC'
end

オプション b)

class Song
    belongs_to :sheet
    default_scope :order => 'songs.id DESC'
end

より多くの関連付けで問題が発生する傾向があるため、デフォルトのスコープを使用することはお勧めしません。


すみません、読み間違えたようです。シートモデルに追加された順序を維持する場合は、 has_many :through を作成する、何らかの性質のピボットテーブルが必要になります。

それは次のようになります。

class Sheet
    has_many :songs, :through => :sheet_songs, :order => 'sheet_songs.created_at DESC'
end
于 2012-07-13T20:03:33.627 に答える
0

たぶん、タイムスタンプを保存し、入力された時間に従って結果を並べ替えます...それが最も賢い購入方法かどうかはわかりません...

于 2012-07-13T20:06:42.843 に答える