使用 rails 中的哈希值创建活动记录

creating active record using no of hashes in rails

我的控制器中没有哈希值,它们是作为表单的一部分提交的 data.The 表单基本上包含任务列表,即任务名称、任务类型等,每个任务都提交了一个 hash.The 哈希看起来像 this.Task 名称哈希

{"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"...}

并且有任务类型hash

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

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

最重要的问题是您需要确保任务名称和任务类型正确匹配。该匹配过程将需要通过使用散列中的位置或通过基于包含排序信息的键进行匹配来进行。

Ruby1.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">]>