2012-07-13 59 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

也許存儲一個時間戳,並根據他們進入的時間命令結果...我不知道它的最聰明的方式買...