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

我不建议使用默认范围,因为它往往会导致更多关联出现问题。


对不起,我想我读错了。如果您要保持它添加到 Sheet 模型的顺序,您将需要一个具有某种性质的数据透视表 - 创建一个 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 回答