2017-05-08 91 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