2012-05-03 126 views
0

我的發佈模型中包含以下代碼以保存與發佈相關的曲目。在當前狀態下,曲目以隨機順序保存到數據庫。我知道SQL語句不是按照設定的順序執行的,也不是原因。我可以使用before_save對nested_attributes進行排序嗎?

accepts_nested_attributes_for :tracks, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => :true 

def track_attributes=(track_attributes) 
    track_attributes.each do |attributes| 
    tracks.build(attributes) 
    artists_tracks.build(attributes) 
    end 
end 

是否可以使用before_save調用添加order_tracks def以確保它們以正確的順序進入數據庫?我有track_number字段可用於確定順序。

這樣的事情?

before_save :order tracks 

def order_tracks 
tracks.sort_by { |track| track.track_number } 
end 

(以上不工作)

編輯

我找到了一個相關的問題。我是通過軌道控制預先設定的標籤和用戶ID使用創建行動:

@track.user_id = current_user.id 
@track.label_id = @release.label.id 

現在,我通過這個accepts_nested_attributes不再有效增加軌道。

我在想如果我能弄清楚在哪裏設置這些,我可以寫一些類似的東西來手動設置我的releases_tracks模型中的位置,而不是通過acts_as_list。

+0

應該是before_save:order_tracks,但是這可能是一個錯字不是你的問題。 –

+0

是的,在這裏錯字....它在我的模型中是正確的,但仍然不起作用:( – Raoot

回答

0

我假設您需要按特定順序選擇這些曲目。然後你就可以在你的關聯定義:order PARAM,例如:

class Album < ActiveRecord::Base 
    has_many :tracks, :order => "track_number asc" 
end 
+0

我已經有這個,它在我的視圖中顯示軌道方面工作正常....但它是重要的,他們得到添加到數據庫正確的順序,因爲有一個與acts_as_list連接表創建一個位置,我想最終使用,以允許拖放重新排序.... – Raoot

+0

啊,但你如何確保軌道添加在我需要表單中包含每個軌道的軌道號碼 – TomDunning

+0

這就是問題所在 - 它們沒有按照正確的順序添加,我可以用我的軌道號字段僞造訂單,但對於例如,如果我有primary_key/name/track_number,我可能會得到1/3/3&2/One/1&3/Two/2。主鍵本身是不相關的,但添加的順序記錄是,因爲它似乎acts_as_list數字基於此的連接中的位置字段。 – Raoot

相關問題