我正在使用一项功能,该功能给出了我的每日工作时间以及合同的开始和结束日期,并在日历中显示了我的工作时间。问题是当我在同一天有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>
答案 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/when和Time#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"}