2010-03-11 34 views
0

我有一個鏈接數組,我保存到數據庫。的問題是,記錄不存儲在該陣列即鏈接[1]的順序之前被保存鏈接[2]等等...如何從Rails中的控制器中的數組中排序一些值?

這是從視圖文件一個例子:

<p> 
    <label for="links_9_label">Label</label> 
    <input id="links_9_name" name="links[9][name]" size="30" type="text" /> 
    <input id="links_9_url" name="links[9][url]" size="30" type="text" /> 
</p> 

這是我的控制器:

def create 
    @links = params[:links].values.collect { |link| @user.links.new(link) } 

    respond_to do |format| 
     if @links.all?(&:valid?) 
     @links.each(&:save!) 

     flash[:notice] = 'Links were successfully created.' 
     format.html { redirect_to(links_url) } 
     else 
     format.html { render :action => "new" } 
     end 
    end 
    end 

提前感謝!

阿爾弗雷德

+0

爲什麼你需要按順序保存它們?我只是好奇:] – 2010-03-11 17:52:36

+0

在我正確的排序功能到位之前,我只是爲了簡單起見將它們按照它們被填充的順序保存。 – Alfred 2010-03-11 18:48:02

回答

1

您的鏈接未按順序存儲的原因是您沒有按順序將它們呈現給數據庫。

- 參數對象不是一個數組,儘管它在一定程度上可能看起來像一個。相反,它們是鍵是整數的散列。你可以說這是真的,因爲你需要使用

params[:links].values.collect 

,如果它是一個數組,你會使用

params[:links].collect 

您使用.values方法的任何時間,關鍵順序是不確定的。

解決方案

我同意@ P.G,你應該非常小心地使用分貝的ID作爲訂單。假設你想稍後改變訂單?我經常在模型中有'list_order'作爲字段。

要重新排序的參數,可以節省在關鍵的順序,請嘗試以下操作:

links_param = params[:links] 
ordered_keys = links_param.keys.sort 
@links = ordered_keys.collect {|key| @user.links.new(links_param[key])} 

補充:也注意到,按鍵很可能進來的字符串,而不是整數。所以,如果你有比他們的10個,可能是一個想法,他們排序爲整數:

ordered_keys = links_param.keys.sort{|a,b| a.to_i <=> b.to_i} 

新增迴應關於保存「display_order」評論 -

第一,爲模型添加新字段:display_order。一定要在該字段上添加索引,因爲您將對其進行排序。

然後,在您的控制器中,您需要將密鑰暴露給模型。例如,像這樣:

links_param = params[:links] 
links_params.keys.each{|key|links_params[key][:display_order] = key.to_i} 

現在,當你建立你的user.link對象時,display_order PARAM也將被設置。

+0

不要讓代碼工作,仍然是一個奇怪的訂單... ...我怎麼能從鏈接[]中獲取數字,並放在一個單獨的列? – Alfred 2010-03-11 18:41:14

+0

得到超過10,並與該代碼段它的工作完美無瑕!非常感謝! – Alfred 2010-03-11 18:52:31

0

改變你的架構,以便使其具有display_order列或類似的東西,有這個擠過作爲前端的隱藏輸入。

依靠id列排序是不鼓勵的,因爲它基本上是由DB創建的任意值,它恰好遵循邏輯序列大多數的時間。有一個單獨的訂單列不會打破DRYness,因爲它是(技術上)用於不同的目的。

相關問題