0

我的控制器中没有哈希值,这些哈希值作为表单数据的一部分提交。表单基本上包含一个任务列表,即任务名称、任务类型等,每个任务都被提交一个哈希值。哈希值看起来像这样。任务名称哈希

{"task_1_name"=>"这是第 1 号任务", "task_2_name"=>"这是第 2 号任务", "task_3_name"=>"这是第 3 号任务", "task_4_name"=>"这是第 4 号任务" ...}

并且有任务类型哈希

{"task_1_type"=>"T","task_2_type"=>"M","task_3_type"=>"D","task_4_type"=>"M"...}

我想要的是像 http://textuploader.com/dr880这样的单个活动记录。任何建议都会有很大帮助。花了几个小时寻找解决方案,但找不到这样的东西

4

1 回答 1

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">]>
于 2017-05-08T03:09:40.203 回答