Rails一对多的关系 - 保持秩序

时间:2012-07-13 19:58:08

标签: ruby-on-rails one-to-many

考虑以下代码:

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

如何保持歌曲的初始顺序?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

也许存储一个时间戳,并根据输入的时间对结果进行排序......我不确定它是最聪明的方式买...