2017-01-28 5 views
3

Я отправляю запрос ajax на действие click, и данные json выглядят следующим образом:Рельсы | Элегантный способ циклирования и сохранения данных json post

{"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 не может быть nil, как я должен петля через, чтобы увидеть какие-либо проверки не выполнены. Тогда, если eveything прекрасно сохраняется в базе данных.

Спасибо

ответ

0

(Прежде всего, отметим, что входные данные в прилагаемом примере фактически уже преобразуется в хэш Ruby, а не JSON.)

в цикле через from и to полей, возвращающих логическое значение, указывающее ли любой из даты диапазоны перекрываются (предполагается, что это 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 для проверки не-ноль).

0

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

Validations поставляются с Rails.

Например:

per_day не может быть нулевым

class YourModel < ActiveRecord 
    validates_presence_of :per_day 
    ... 
end 

Можете ли вы ответить на несколько вопросов, чтобы помочь с датой перекрытия валидаций:

  1. должен там НИКОГДА быть перекрытыми или быть уникальными для определенного пользователя/объекта/Недвижимость-вещь?
  2. У вас есть вопрос о цикле или, в основном, о проверке группы?
Смежные вопросы