【发布时间】:2021-10-15 09:40:59
【问题描述】:
目前我在 Ruby on Rails 中同步时间段时遇到问题。
我需要比较 2 个从无到 n 哈希的数组,然后在“结果”数组中有同步时间段。
举个例子:
time_periods_a = [
{ start_date: '01/10/2021', end_date: '31/10/2021',
additional_attribute: 5 },
{ start_date: '01/11/2021', end_date: '30/11/2021',
additional_attribute: 10 }
]
time_periods_b = [
{ start_date: '01/10/2021', end_date: '31/12/2021',
additional_attribute: 20 }
结果应该是:
[
{ start_date: '01/10/2021', end_date: '31/10/2021',
additional_attribute_a: 5, additional_attribute_b: 20 },
{ start_date: '01/11/2021', end_date: '30/11/2021',
additional_attribute_a: 10, additional_attribute_b: 20 },
{ start_date: '01/12/2021', end_date: '31/12/2021',
additional_attribute_a: 0, additional_attribute_b: 20 }
]
也许你对此有一个简单的解决方案,我已经绝望了 2 天。
编辑:
由于我没有很好地解释这个问题,这里是一个编辑:
这两个数组可能包含重叠的哈希值。通常,这些必须分成几个时期。
也许是另一个例子,有点短但更复杂。
time_periods_a: [1 - 2, 3 - 6, 7 - 9]
time_periods_b: [ 2-5, 6-9]
这需要导致:[1-1, 2-2, 3-5, 6-6, 7-9]
这个数字只是月份索引,因为 start_date 每次都是月初,end_date 是月底。
不需要两个数组包含相同的句点,但这是可能的。
这就是我添加附加属性的原因。
如果一个时间段包含在 1 个数组中但没有包含在另一个数组中,那么我需要添加这个时间段,只需要一个 additional_attribute: 0
编辑我之前使用的 #2 代码
def format_date_ranges(example_model)
first_array = example_model.first_array
second_array = example_model.second_array
return first_array.map { |hash| hash.merge('additional_attribute_b' => hash['additional_attribute'], 'additional_attribute_b' => 0) } if second_array.blank?
return first_array.map { |hash| hash.merge('additional_attribute_a' => hash['additional_attribute'], 'additional_attribute_b' => 0) } if second_array.blank?
iterate_count = [first_array.size, second_array.size].max
result_array = []
iterate_count.times do |index|
relevant_first_hash = first_hash[index]
releveant_second_hash = second_hash[index]
if relevant_first_hash.nil?
result_array << result_hash(0,
releveant_second_hash['additional_attribute'],
releveant_second_hash['start_date'],
releveant_second_hash['end_date'],
'')
next
end
if relevant_second_hash.nil?
result_array << result_hash(relevant_first_hash['additional_attribute'],
0,
relevant_first_hash['start_date'],
relevant_first_hash['end_date'],
relevant_first_hash['interval'])
next
end
first_start_date = relevant_first_hash['start_date'].to_date
first_end_date = relevant_first_hash['end_date'].to_date
second_start_date = relevant_second_hash['start_date'].to_date
second_end_date = relevant_second_hash['end_date'].to_date
if first_start_date == second_start_date
start_date = second_start_date
else
start_date = [first_start_date, second_start_date].min
end_date = [first_start_date, second_start_date].max - 1.day
result_array << result_hash(relevant_first_hash['additional_attribute'],
relevant_second_hash['additional_attribute'],
start_date,
end_date,
relevant_first_hash['interval'])
start_date = [first_start_date, second_start_date].max
end
if first_end_date == second_end_date
end_date = second_end_date
else
end_date = [first_end_date, second_end_date].min
result_array << result_hash(relevant_first_hash['additional_attribute'],
relevant_second_hash['additional_attribute'],
start_date,
end_date,
relevant_first_hash['interval'])
start_date = end_date + 1.day
end_date = [first_end_date, second_end_date].max
end
result_array << result_hash(relevant_first_hash['additional_attribute'],
relevant_second_hash['additional_attribute'],
start_date,
end_date,
relevant_first_hash['interval'])
end
result_array
end
def result_hash(additional_attribute_a, additional_attribute_b, start_date, end_date, interval)
{ additional_attribute_a: additional_attribute_a, additional_attribute_b: additional_attribute_b, start_date: start_date, end_date: end_date, interval: interval }
end
【问题讨论】:
-
“同步时间段”是什么意思?因为你可以通过简单的
time_periods_a + time_periods_b得到你想要的结果(假设你在time_periods_b的定义中有错字,start_date应该是01/12/2021)。但我怀疑明显的拼写错误实际上是您的问题所在,并且您有一个更复杂的要求,您没有解释。 -
@JohnP 也许我没有像预期的那样解释这个问题。
start_date中没有错字。这两个数组可能包含重叠的哈希。通常,这些必须分成几个时期。也许是另一个例子,有点短但更复杂。 time_periods_a:[1 - 2, 3 - 6, 7 - 9]time_periods_b:[ 2-5, 6-9]这需要导致:[1-1, 2-2, 3-5, 6-6, 7-9]这个数字只是月份索引,因为start_date每次都在月初,end_date在月底。也许现在更清楚了。 -
那么,正如我所问的,“同步时间段”是什么意思?我真的不知道你想在这里解决什么问题。 (特别是在其中一个日期范围内肯定存在问题,因为它指的是结束日期
31/11/2021,它不存在。) -
@JohnP 编辑了评论。
-
不需要两个数组包含相同的句点,但这是可能的。这就是我添加附加属性的原因。如果一个时间段包含在 1 个数组中但没有包含在另一个数组中,那么我需要添加这个时间段,只需要一个
additional_attribute: 0
标签: ruby-on-rails ruby-on-rails-6