导轨|循环并保存json发布数据的优雅方式

时间:2017-01-28 09:49:21

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

我发布了一个关于点击操作的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不能为零,我应该如何循环以查看未满足任何验证。然后,如果eveything保存到数据库。

谢谢

2 个答案:

答案 0 :(得分:0)

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

Rails会附带验证。

例如:

  

scale(...)不能为零

per_day

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

  1. 不应该重叠,或者它们对某个用户/对象/属性是唯一的吗?
  2. 您对循环或主要是群组验证有疑问吗?

答案 1 :(得分:0)

(首先,请注意,提供的示例中的输入数据实际上已经转换为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验证来验证not-nil。)