Ruby on rails 如何在RubyonRails中将给定的哈希解析为所需的输出?
我必须向用户发送每日课程更新通知。更新通知包含四种类型的[:到期、:错过、:过期、:新建]。为了方便起见,我从数据中省略了不必要的字段,例如due和missed,因为它与过期和新格式相同。下面提供的数据属于一个用户。一个用户可以是许多课程的一部分,这就是为什么哈希课程id 20和30中有两个不同的课程id。id在此表示特定课程中的作业id。 数据的实际格式为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 => {
{
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太好了。如果我的答案对你有效,请接受>谢谢