2012-07-13 38 views
0

考虑以下代码:Rails的一个一对多的关系 - 维持秩序

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 

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

+0

你也可以'歌曲= Sheet.find(1).songs.order( “id asc”)'或'songs = Sheet.find(1).songs.sort_by(&:id)' – house9 2012-07-13 20:08:12

+0

@ house9我不想用'id'命令。我想保留原来的订单,它的订单被添加进来。 – 2012-07-13 20:40:55

+0

啊是的,那么你需要一个额外的模型,因为@ CrazyVipa建议 – house9 2012-07-13 20:58:44

回答

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:通过

它就会变成:

class Sheet 
    has_many :songs, :through => :sheet_songs, :order => 'sheet_songs.created_at DESC' 
end 
0

也许存储一个时间戳,并根据他们进入的时间命令结果...我不知道它的最聪明的方式买...