2016-09-19 2 views
0

Order has_many RentalItemsRails - 変更されていない属性は変更されたとして登録されていますか?

RentalItemはそのsizeまたはspecification変更を持っている、または新しい子RentalItemが追加されました。いつでもポイントがxyz_method実行されることですだから私はOrderにこのコールバックを持っています

before_save do 
    if rental_items_attributes_modified? 
    xyz_method 
    end 
end 

def rental_items_attributes_modified? 
    self.rental_items.each do |ri| 
    # as long as ONE item had ONE thing changed, we return true or it's a new record 
    puts "in RI modified?" 
    puts "#{ri.new_record?} with ID #{ri.id}" 
    puts "#{ri.specification_changed?} from #{ri.specification_was} to #{ri.specification}" 
    puts "#{ri.size_changed?} from #{ri.size_was} to #{ri.size}" 
    if ri.specification_changed? || ri.size_changed? || ri.new_record? 
     return true 
    end 
    end 
    return false 
end 

すべてputsは私のデバッグを支援した...私は考えている理由が、rental_items_attributes_modified?RentalItemsのONE、ことはありませんにもかかわらずspecification_changed?戻っtrueが...これが関連しているので、trueを返し続けます当初specification = ""、質問に奇妙な二子RIについて

# testing the first child RI 
in RI modified? 
false with ID 1 
false from blue to blue 
false from Regular to Regular 

# testing the second child RI 
in RI modified? 
false with ID 2 
true from to # <<< why is this happening??? 
false from Regular to Regular 

、そして何が渡されると、このようなのparamsです:ログ出力を

"rental_items_attributes"=>[{"id"=>"2", "specification"=>"", "size"=>"Regular"}] 

私はコンソールでこのスタンドアロンを試してみましたが、それは正しい動作をトリガ...

# for an order whose child RI initially had a blank specification & size 
o.update_attributes({"rental_items_attributes" => [{"id" => 79, "specification" => ""}]}) 
=> 
in RI modified? 
false with ID 79 
false from to 
false from to 
+1

'specification'のデフォルト値はありますか?これはnil対 ""の問題かもしれません。 –

+0

私はそれを見て、同じ疑惑を持っていた、それは問題ではない。子どもが最初に作成されたときに '' specification 'は '' 'として始まります – james

答えて

0

それはちょうどコメントだが、私が原因あまり評判にコメントを書き込むことはできません。 (したがって、このコメントは無視できます)

before_saveブロックの値を確認したことがありますか?同様に、

ri.specification_was.nil? 
ri.specification.nil? 

どちらも偽ですか?

+0

OMG私はとてもばかげているので... John Feltzに対する私の応答は' nil'は問題ではなく、私はそれを絶対に確信していました。あなたの答えは私が二重チェックしたいので、インスタンスの1つが 'nil'と読んでいたことが判明しましたので、ちょっと狂って掘り下げてなぜGODDAMN TYPOが出てきたのですか? 'speciification =>" "'のようなものなので、paramは決してDBに当たらない! UGH – james