最重要的问题是您需要确保任务名称和任务类型正确匹配。该匹配过程将需要通过使用哈希中的位置或通过基于包含排序信息的键进行匹配来进行。
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">]>