Ruby on rails 如何在RubyonRails中将给定的哈希解析为所需的输出?

Ruby on rails 如何在RubyonRails中将给定的哈希解析为所需的输出?,ruby-on-rails,ruby,ruby-on-rails-4,ruby-hash,Ruby On Rails,Ruby,Ruby On Rails 4,Ruby Hash,我必须向用户发送每日课程更新通知。更新通知包含四种类型的[:到期、:错过、:过期、:新建]。为了方便起见,我从数据中省略了不必要的字段,例如due和missed,因为它与过期和新格式相同。下面提供的数据属于一个用户。一个用户可以是许多课程的一部分,这就是为什么哈希课程id 20和30中有两个不同的课程id。id在此表示特定课程中的作业id。 数据的实际格式为 { 1 => { #the 1st user :new => { 1 => {

我必须向用户发送每日课程更新通知。更新通知包含四种类型的[:到期、:错过、:过期、:新建]。为了方便起见,我从数据中省略了不必要的字段,例如due和missed,因为它与过期和新格式相同。下面提供的数据属于一个用户。一个用户可以是许多课程的一部分,这就是为什么哈希课程id 20和30中有两个不同的课程id。id在此表示特定课程中的作业id。 数据的实际格式为

  { 
   1 => { #the 1st user
     :new => {
          1 => {
           :id => 1,
           :course_id =>20,
           :course_name => "B"
          },
          2 => {
           :id => 2,
           :course_id =>30,
           :course_name => "A"
         },
         3 => {
           :id => 3,
           :course_id =>20,
           :course_name => "B"
         }
       }
       :over_due => {}, #This is also having the same format as new
       :missed => {}, #This is also having the same format as new
       :due => {} #This is also having the same format as new
     },
    2 => { #this is 2nd user
       :new => {},
       :over_due => {},
       :missed => {},
       :due => {}
     }
   }
假设,这只是我为用户创建的一个虚拟数据,以便更加清晰和解释

assignments = {
  :new => {
    1 => {
      :id => 1,
      :course_id => 20,
      :name => "A"
    },
    2 => {
      :id => 2,
      :course_id => 20,
      :name=>"A"
    },
    3 => {
      :id => 3,
      :course_id => 30,
      :name=>"B"
    }
  },
  :over_due => {
    4 => {
      :id => 4,
      :course_id => 20,
      :name => "A"
    },
    5 => {
      :id => 5,
      :course_id => 30,
      :name => "B"
    }
  }
}
我需要将数据解析为这种格式:

{
  20 => {
    :new => {
      1 => {
        :id => 1,
        :course_id => 20,
        :name=>"A"
      },
      2 => {
        :id => 2,
        :course_id => 20,
        :name => "B"
      }
    },
    :over_due => {
      4 => {
        :id => 4,
        :course_id => 20,
        :name => "E"
      }
    }
  },
  30 => {
    :new => {
      3 => {
        :id => 3,
        :course_id => 30,
        :name => "C"
      }
    },
    :over_due => {
      5 => {
        :id => 5,
        :course_id => 30,
        :name=>"F"
      }
    }
  }
}

为您的解决方案检查以下代码:

 hash = {} 
 assignments.each do |type,type_data| 
    type_data.each do |assignment_id,data| 
        course_id = data[:course_id]
        hash[course_id] = {} if hash[course_id].nil?
        hash[course_id][type]= {} if hash[course_id][type].nil?
        hash[course_id][type][assignment_id] = data 
    end 
end
输出:

{20=>{:new=>{1=>{:id=>1, :course_id=>20, :name=>"A"}, 2=>{:id=>2, :course_id=>20, :name=>"B"}}, :over_due=>{4=>{:id=>4, :course_id=>20, :name=>"E"}}}, 30=>{:new=>{3=>{:id=>3, :course_id=>30, :name=>"C"}}, :over_due=>{5=>{:id=>5, :course_id=>30, :name=>"F"}}}}

首先,向我们展示您迄今为止的尝试。那么,用清晰的语言来说,预期的结果是什么呢。您的一些散列已经:course\u id已转换为值,而其他一些尚未转换为值。。。给我们一些见解。我已经更新了问题。请看下面的代码。hash={}assignments.each do | type,type | data | type | type | data | each do | assignment | id,data | course | id=data[:course | id]hash[course | id]={}hash[course | id][type]={}hash[course | hash[courseend@MukeshKumarGupta不要在注释部分编写代码,这很难读。请把它很好地格式化。另外,你能提供更多的上下文来说明你在这里实际要解决的问题吗?你得到了一堆非常难看的散列;可能有更好的方法来解决实际问题。这是我第一次发布问题。我记得你的建议。是的!它正在工作。我得到了我错过的东西。我每次都是盲目地创建空哈希。我认为我们可以优化。如果我能找到更好的方法。我会在相同的线程后。谢谢。@MukeshKumarGupta太好了。如果我的答案对你有效,请接受>谢谢