2012-05-02 8 views
1

Ryan Bate's nested model form tutorialを使用してリリース用のトラックを作成しました(チュートリアルではアンケートのための質問です)。Railsのネストされたモデルフォームが子オブジェクトのランダムな順序を示しています

これは、トラックがDBに追加される順序が見た目にランダムではなく、私が必要とする形で入力されていることに気が付くまでうまくいきます。

トラックがリリースモデルに以下の定義を使用して構築されています:

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

次にリリース_formに部分的に私が持っている:

部分_track_fieldsに引っ張る
<%= f.fields_for :tracks do |builder| %> 
<%= render 'track_fields', :f => builder %> 
<% end %> 

、含む:

<%= f.text_field :name, :class => "text" %> 
<%= f.text_field :isrc, :class => "text" %> 
<%= f.check_box :_destroy %> 
etc 

トラックの配列が、 eは入力しましたか?

私はacts_as_listをreleases_tracksに使用しています。これはうまく動作するスルーモデルですが、トラックテーブルに誤って追加されたものから順番をとります。

EDIT:

に思える私のトラックが一緒に保存されています:

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

ない、私が考えていたようデフtrack_attributes =(track_attributes)を介して。

私は今フォームに追加した位置フィールドでトラックをソートするbefore_saveメソッドを書く方法を知っていますか?

答えて

1

SQLクエリの実行順序は一般的にランダムです。これは、一括挿入と選択の両方に適用できます。特定の順序でレコードが必要な場合は、ORDER BY句を使用する必要があります。レコードの保存方法によっては、IDをソートできる場合もあります。そうでない場合は、各アイテムのリスト位置を表すフィールドを追加することを検討してください。

+0

ああ、私はこれが事実かもしれないと思った。トラックを保存していると思っていたtracks.build(属性)行をコメントアウトした後、トラックが現在どのように保存されているのか分かりません。 – Raoot

+0

buildはActiveRecordオブジェクトを保存しません。単にそれをメモリに作成するだけです。 – Salil

+0

ああ、私は参照してください。これを達成するために、私のリリースモデルに 'sort_tracks'定義とbefore_save呼び出しを追加できるかどうか、どんな考えですか? – Raoot

関連する問題