【问题标题】:creating active record using no of hashes in rails使用没有在 rails 中的散列创建活动记录
【发布时间】:2017-05-08 01:37:52
【问题描述】:

我的控制器中没有哈希值,这些哈希值作为表单数据的一部分提交。表单基本上包含一个任务列表,即任务名称、任务类型等,每个任务都提交一个哈希值。哈希值看起来像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。任何建议都会有很大帮助。花了几个小时寻找解决方案,但找不到类似的东西

【问题讨论】:

  • @moveson 对于我想要的所有记录:id、task_name、:task_type.have 更正了图片
  • 每个哈希中的键/值对的顺序是取决于键名还是键/值对出现的实际顺序?换句话说,每个键中实际上是否有一个数字表示对应该排序的正确顺序,如问题所示,或者实际名称与它们的顺序无关?
  • 另外,是否有可能在一个散列中跳过一个键而不是另一个?例如,名称散列是否可以从task_4_name 跳转到task_6_name,而散列类型包含task_4_typetask_5_typetask_6_type
  • @moveson 顺序很重要,例如 task_1_name 和 task_1_type 表示数据与任务 1 相关联。数据属于表单,请参阅此链接 unsee.cc/rigomenu
  • 好的,但是第一个任务的密钥的实际名称是task_1_name吗?还是只是task_name?还是别的什么?

标签: ruby-on-rails ruby rails-activerecord ruby-hash


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-26
    • 2011-10-06
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2015-10-14
    相关资源
    最近更新 更多