{"0"=>{"seasons"=>{ "0"=>{"from"=>"2017-01-04", "to"=>"-6ren">
gpt4 book ai didi

ruby-on-rails - rails |循环和保存 json post 数据的优雅方式

转载 作者:行者123 更新时间:2023-12-04 18:36:17 25 4
gpt4 key购买 nike

我在点击操作上发布了一个 ajax 请求,json 数据看起来像这样;

{"data"=>{"0"=>{"seasons"=>{
"0"=>{"from"=>"2017-01-04", "to"=>"2017-01-07", "weekday"=>"1", "per_day"=>"100", "weekly"=>"230", "weekend"=>"200", "available"=>"false", "check_in"=>"08:00", "check_out"=>"08:00", "sevendays"=>"false", "checkin_day"=>""},
"1"=>{"from"=>"2017-01-17", "to"=>"2017-01-20", "weekday"=>"1", "per_day"=>"250", "weekly"=>"323", "weekend"=>"300", "available"=>"false", "check_in"=>"08:30", "check_out"=>"08:00", "sevendays"=>"false", "checkin_day"=>""},
"2"=>{"from"=>"2017-02-01", "to"=>"2017-02-04", "weekday"=>"1", "per_day"=>"100", "weekly"=>"500", "weekend"=>"230", "available"=>"false", "check_in"=>"08:00", "check_out"=>"07:30", "sevendays"=>"false", "checkin_day"=>""}}}
}

我需要遍历 from & to如果它们重叠,则字段。我知道有一个函数,所以我可以像 (from1..to1).overlaps?(from2..to2) 一样使用它如果它们重叠,我应该返回 json 错误,这很好。

另一件事例如 per_day 不能为零,我应该如何 循环 看任何验证都不符合。然后,如果一切都很好,请保存到数据库。

谢谢

最佳答案

(首先,请注意,提供的示例中的输入数据实际上已经转换为 Ruby 哈希,而不是 JSON。)

循环 fromto返回 bool 值的字段,指示是否有任何日期范围重叠(假设 x 是输入数据):

require 'date'
any_overlap = x['data']['0']['seasons'].
# Parse 'from' and 'to' into a Range of Dates
map{|k, v| Date.parse(v['from'])..Date.parse(v['to']) }.
# Sort by start date
sort_by(&:begin).
# Compare each consecutive pair of dates
each_cons(2).
# Return true if any pair has overlapping begin/end dates
any? { |x, y| x.end > y.begin }

循环输入,返回一个 bool 值,指示是否有 per_day值为 nil :
any_nil = x['data']['0']['seasons'].any?{|k, v| v['per_day'].nil?}

至于在一切正常的情况下将输入持久化到数据库的一种优雅方式,这取决于您希望将此输入如何准确地映射到现有数据库模式,以及现有模型的内容(您需要将其包含在您对这部分的更完整答案的问题)。这可能需要将重叠范围代码放在自定义 Active Record Validation 中。过程(您可以使用现有的 presence 验证来验证非零)。

关于ruby-on-rails - rails |循环和保存 json post 数据的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41908408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com