Rails的一个一对多的关系 - 维持秩序
问题描述:
考虑以下代码: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
如何保持歌曲的初始顺序?
答
为了有一个默认的顺序,你可以做一些事情。
选项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
答
也许存储一个时间戳,并根据他们进入的时间命令结果...我不知道它的最聪明的方式买...
你也可以'歌曲= Sheet.find(1).songs.order( “id asc”)'或'songs = Sheet.find(1).songs.sort_by(&:id)' – house9 2012-07-13 20:08:12
@ house9我不想用'id'命令。我想保留原来的订单,它的订单被添加进来。 – 2012-07-13 20:40:55
啊是的,那么你需要一个额外的模型,因为@ CrazyVipa建议 – house9 2012-07-13 20:58:44