最重要的問題是您需要確保您的任務名稱和任務類型正確匹配。該匹配過程需要通過使用哈希中的位置或基於包含訂購信息的鍵進行匹配來實現。
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">]>
@moveson爲我想要的所有記錄:id,task_name,:task_type.have更正了圖片 – yogeshmanjhi
每個散列中的鍵/值對的順序取決於鍵名或鍵/值對的實際順序?換句話說,如問題中所示,每個關鍵字中是否實際存在一個數字,指示對應排序的正確順序,還是實際名稱與順序無關? – moveson
另外,是否有可能在一個哈希中跳過密鑰而不是另一個?例如,名稱散列可以從「task_4_name」跳到「task_6_name」,而類型散列包含「task_4_type」,「task_5_type」,「task_6_type」? – moveson