如何在每次循环迭代中创建一个新的JSON对象

时间:2019-07-18 21:24:52

标签: ruby-on-rails json ruby ruby-on-rails-5

我正在使用一项功能,该功能给出了我的每日工作时间以及合同的开始和结束日期,并在日历中显示了我的工作时间。问题是当我在同一天有2个或更多班次时。假设Julian从2019年7月17日到2019年7月31日,每个星期一从03:00转换到04:00,并且在同一天从5:00到6:00转换另一个。这意味着我的日历应显示这7个班次分别在7月22日和7月29日进行。我已经编码了逻辑以使我获得正确的日期。截至目前,我的JSON响应如下所示

{“ user”:“ Julian”,“ start”:“ 2019-07-22”,“ day”:“ Monday”,“ start_time”:[“ 03:00”,“ 05:00”], “ end_time”:[“ 04:00”,“ 06:00”]}},{“ user _”:“ Julian”,“ start”:“ 2019-07-29”,“ day”:“ Monday”,“ start_time “:[” 03:00“,” 05:00“],” end_time“:[” 04:00“,” 06:00“]}

由JSON构建器文件中的以下代码生成


        json.array! event.each do |inevent|

              json.id hr_schedule.id
              json.user_id hr_schedule.user_id

              json.start inevent.strftime('%Y-%m-%d') 
              day_of_week = inevent.strftime('%A') 
              json.day day_of_week
              if day_of_week == "Monday"
                  json.start_time hr_schedule.monday_st
                  json.end_time hr_schedule.monday_end  
              elsif day_of_week == "Tuesday"
                  json.start_time hr_schedule.tuesday_st
                  json.end_time hr_schedule.tuesday_end               
              elsif day_of_week == "Wednesday"
                  json.start_time hr_schedule.wednesday_st
                  json.end_time hr_schedule.wednesday_end   
              elsif day_of_week == "Thursday"

                  json.start_time hr_schedule.thursday_st
                  json.end_time hr_schedule.thursday_end    
              elsif day_of_week == "Friday"

                  json.start_time hr_schedule.friday_st
                  json.end_time hr_schedule.friday_end  

              elsif day_of_week == "Saturday"
                  json.start_time hr_schedule.saturday_st
                  json.end_time hr_schedule.saturday_end    
              elsif day_of_week == "Sunday" 
                  json.start_time hr_schedule.sunday_st
                  json.end_time hr_schedule.sunday_end  
              end



     end    

我想要实现的是能够将所有事件作为唯一的JSON对象,如下所示

{“ user”:“ Julian”,“ start”:“ 2019-07-22”,“ day”:“ Monday”,“ start_time”:“ 03:00”,“ end_time”:“ 04:00 “},{” user“:” Julian“,” start“:” 2019-07-22“,” day“:” Monday“,” start_time“:” 05:00“,” end_time“:” 06:00 “}, {“ user”:“ Julian”,“ start”:“ 2019-07-29”,“ day”:“ Monday”,“ start_time”:“ 03:00”,“ end_time”:“ 04:00”}, {“ user”:“ Julian”,“ start”:“ 2019-07-29”,“ day”:“ Monday”,“ start_time”:“ 05:00”,“ end_time”:“ 06:00”} < / p>

1 个答案:

答案 0 :(得分:0)

我不确定json在做什么,array!在做什么。但是,执行所需操作的基本方法是使用map将事件转换为哈希数组。然后使用to_json将数组转换为JSON。

calendar = event.map do |inevent|
  json = {}

  json[:id] = hr_schedule.id
  json[:user] = hr_schedule.user_id

  json[:start] = inevent.strftime('%Y-%m-%d') 
  json[:day] = inevent.strftime('%A')

  case inevent.wday
  when 0
    json[:start_time] = hr_schedule.sunday_st
    json[:end_time] = hr_schedule.sunday_end  
  when 1
    json[:start_time] = hr_schedule.monday_st
    json[:end_time] = hr_schedule.monday_end  
  when 2
    json[:start_time] = hr_schedule.tuesday_st
    json[:end_time] = hr_schedule.tuesday_end               
  when 3
    json[:start_time] = hr_schedule.wednesday_st
    json[:end_time] = hr_schedule.wednesday_end   
  when 4
    json[:start_time] = hr_schedule.thursday_st
    json[:end_time] = hr_schedule.thursday_end    
  when 5
    json[:start_time] = hr_schedule.friday_st
    json[:end_time] = hr_schedule.friday_end  
  when 6
    json[:start_time] = hr_schedule.saturday_st
    json[:end_time] = hr_schedule.saturday_end    
  end

  json
end

puts calendar.to_json

我通过使用case/whenTime#wday对其进行了一些简化。如果应用程序的语言发生变化,strftime(%A)可能会发生变化,并且星期几的数字很难打错。


请注意,此事件结构将自身限制为仅在午夜之前结束的事件。考虑改为使用完整的ISO8061日期时间作为开始和结束时间。通常,使用完整的日期时间比单独的日期和时间要容易得多。可以从start推断出活动日期。

{"user":"Julian","start":"2019-07-22T03:00","end":"2019-07-22T04:00"}

或者,如果事件是相对的,例如每个星期一发生,请考虑一个起点和一个duration。并在一天中使用ISO weekday number而不是字符串,从而减少了接收者要做的解析。

{"user":"Julian","day":1,"start":"03:00","duration":"P1H"}