2017-01-28 28 views
3

クリックアクションでajaxリクエストを投稿しています.jsonデータはこのように見えます。Rails | 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には何もできません。どのようにしてをループして、のループを検証する必要がありますか。次に、eveythingがうまくいれば、データベースに保存します。

答えて

0

(まず、与えられた例において、入力データが実際に既にRubyのハッシュではなく、JSONに変換されることに注意してください。)ループに

をするかどうかを示すブール値を返すfromtoフィールドを範囲が重複日付のいずれか(x仮定は、入力データである):per_day値のいずれかがあるかどうかを示すブール値を返す入力をループし

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 } 

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

検証ありがとうレールが付属しています。例えば

per_dayは、日付の重複の検証を支援するためにいくつかのより多くの質問に答えることができます

class YourModel < ActiveRecord 
    validates_presence_of :per_day 
    ... 
end 

nilをすることはできません。

  1. をすべきであるがNEVER重複しているか、特定のユーザ/オブジェクトに固有のものか/プロパティ - もの?
  2. ルーピングまたは主にグループ検証に関する質問がありますか?
関連する問題