2017-05-08 160 views
0

我在我的控制器中獲取了作爲表單數據一部分提交的散列值。窗體基本上包含任務列表,即任務名稱,任務類型等,每個任務都是越來越提交了hash.The哈希看起來像this.Task名散在軌道中使用散列號創建活動記錄

{ 「task_1_name」=> 「這是任務1號」, 「task_2_name」=> 「這是沒有的任務2」, 「task_3_name」 => 「這是任務沒有3」, 「task_4_name」=> 「這是task_no_4」 ...}

且有任務類型散列

{ 「task_1_type」=> 「T」, 「task_2_type」=> 「M」, 「task_3_type」=> 「d」, 「task_4_type」=> 「M」 ...}

我想要的是單個活動記錄,如 http://textuploader.com/dr880。任何建議將是很大的幫助。花了幾個小時尋找解決方案,但找不到像這樣的任何東西

+0

@moveson爲我想要的所有記錄:id,task_name,:task_type.have更正了圖片 – yogeshmanjhi

+0

每個散列中的鍵/值對的順序取決於鍵名或鍵/值對的實際順序?換句話說,如問題中所示,每個關鍵字中是否實際存在一個數字,指示對應排序的正確順序,還是實際名稱與順序無關? – moveson

+0

另外,是否有可能在一個哈希中跳過密鑰而不是另一個?例如,名稱散列可以從「task_4_name」跳到「task_6_name」,而類型散列包含「task_4_type」,「task_5_type」,「task_6_type」? – moveson

回答

0

最重要的問題是您需要確保您的任務名稱和任務類型正確匹配。該匹配過程需要通過使用哈希中的位置或基於包含訂購信息的鍵進行匹配來實現。

Ruby 1.9+中的哈希是有序的,所以可以依賴位置,但是如果我們可以依賴關鍵字本身的排序信息,它會增加一些確定性。假設您收到的密鑰實際上包含如示例中所示的連續編號,則可以根據該編號索引每個散列值開始。首先,我們將哈希分配給變量:

>> name_hash = {"task_1_name"=>"This is task no 1", "task_2_name"=>"This is task no 2", "task_3_name"=>"This is task no 3", "task_4_name"=>"This is task_no_4"} 
>> type_hash = {"task_1_type"=>"T","task_2_type"=>"M","task_3_type"=>"D","task_4_type"=>"M"} 

接下來我們將基於序列號爲每個散列編制索引。我們可以提取使用String#split方法,選擇第二個元素,所以它排序正確如果數字超越單個數字將其轉換爲整數,數:

>> indexed_name_hash = name_hash.index_by { |k,_| k.split('_').second.to_i } 
-> {1=>["task_1_name", "This is task no 1"], 2=>["task_2_name", "This is task no 2"], 3=>["task_3_name", "This is task no 3"], 4=>["task_4_name", "This is task_no_4"]} 
>> indexed_type_hash = type_hash.index_by { |k,_| k.split('_').second.to_i } 
-> {1=>["task_1_type", "T"], 2=>["task_2_type", "M"], 3=>["task_3_type", "D"], 4=>["task_4_type", "M"]} 

現在,我們有一個可靠的方法來配對名稱與類型,我們將使用Array#map來建立我們想要的屬性。 Hash#keys只給出了我們其中一個哈希值的鍵,在本例中它將是[1, 2, 3, 4]。然後,我們這些整數映射到相應的數據值:

>> paired_attributes = indexed_name_hash.keys.map { |number| {task_name: indexed_name_hash[number].last, task_type: indexed_type_hash[number].last} } 
-> [{:task_name=>"This is task no 1", :task_type=>"T"}, {:task_name=>"This is task no 2", :task_type=>"M"}, {:task_name=>"This is task no 3", :task_type=>"D"}, {:task_name=>"This is task_no_4", :task_type=>"M"}] 

現在,我們有我們的屬性正確的哈希值的數組配對,我們只需在陣列上進行迭代,並創建任務:

>> paired_attributes.each { |attributes| Task.create(attributes) } 
>> Task.all 
#<ActiveRecord::Relation [#<Task id: 1, task_name: "This is task no 1", task_type: "T">, #<Task id: 2, task_name: "This is task no 2", task_type: "M">, #<Task id: 3, task_name: "This is task no 3", task_type: "D">, #<Task id: 4, task_name: "This is task_no_4", task_type: "M">]> 
+0

感謝很多人你救了我的一天。謝謝:) – yogeshmanjhi