【问题标题】:Rails | Elegant way of looping through and saving json post data导轨 |循环和保存 json post 数据的优雅方式
【发布时间】:2017-01-28 09:49:21
【问题描述】:

我在点击操作上发布了一个 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"=>""}}}
}

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

另一件事,例如 per_day 不能为 nil,我应该如何循环查看未满足任何验证。然后如果一切都很好保存到数据库。

谢谢

【问题讨论】:

    标签: ruby-on-rails arrays json loops controller


    【解决方案1】:

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

    循环遍历fromto 字段,返回一个布尔值,指示是否有任何日期范围重叠(假设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 }
    

    循环输入,返回一个布尔值,指示 per_day 值是否为 nil

    any_nil = x['data']['0']['seasons'].any?{|k, v| v['per_day'].nil?}
    

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

    【讨论】:

      【解决方案2】:

      http://guides.rubyonrails.org/active_record_validations.html

      Rails 附带验证。

      例如:

      per_day 不能为 nil

      class YourModel < ActiveRecord
        validates_presence_of :per_day
        ...  
      end
      

      您能否回答更多问题以帮助验证日期重叠:

      1. 是否应该永远存在重叠,或者它们是特定用户/对象/属性事物独有的?
      2. 您对循环或主要是组验证有疑问吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-21
        • 2020-10-08
        • 1970-01-01
        • 1970-01-01
        • 2019-09-02
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多