Nested form validation statements repeating multiple times

痞子三分冷 提交于 2019-12-12 05:49:08

问题


Given the following associations:

class Parent
  has_many :a_childs
  validates_associated :a_childs
  accepts_nested_attributes_for :a_childs

  has_many :b_childs
  validates_associated :b_childs
  accepts_nested_attributes_for :b_childs

  has_many :charges
  validates_associated :charges
  accepts_nested_attributes_for :charges

  validate :test_puts

  def test_puts
    puts "validating Parent - #{self.attribute}"
  end
end


class AChild
  belongs_to :parent

  has_many :charges
  validates_associated :charges
  accepts_nested_attributes_for :charges

  validate :test_puts

  def test_puts
    puts "validating AChild - #{self.attribute}"
  end
end

class BChild
  belongs_to :parent

  has_many :charges
  validates_associated :charges
  accepts_nested_attributes_for :charges

  validate :test_puts

  def test_puts
    puts "validating BChild - #{self.attribute}"
  end
end


class Charge
  belongs_to :parent
  belongs_to :a_child
  belongs_to :b_child

  validate :test_puts

  def test_puts
    puts "validating Charge - #{self.attribute}"
  end
end

When I run a create like the below: a Parent with 2 AChilds each with 2 Charges and 1 BChild with 1 Charge and then finally with 1 Charge on the Parent itself, like the below:

Parent.create(
{
  "attribute" => "order",
  "a_childs_attributes"=> 
    [
      {
        "attribute"=>"a child 1",
        "charges_attributes" => 
          [
            {"attribute" => "a child 1 chg a"},
            {"attribute" => "a child 1 chg b"}
          ]
      },
      {
        "attribute"=>"a child 2",
        "charges_attributes" => 
          [
            {"attribute" => "a child 2 chg 1"},
            {"attribute" => "a child 2 chg 2"}
          ]
      }
    ]
  "b_childs_attributes"=> 
    [
      {
        "attribute"=>"b child",
        "charges_attributes" => 
          [
            {"attribute" => "b child chg"}
          ]
      },
    ]
  "charges_attributes" =>
    [
      {"attribute" => "order chg"}
    ]
}

I would expect the puts statements to run like the below:

validating Charge - a child 1 chg a
validating Charge - a child 1 chg b
validating AChild - a child 1
validating Charge - a child 2 chg 1
validating Charge - a child 2 chg 2
validating AChild - a child 2
validating Charge - b child chg
validating BChild - b child
validating Charge - order chg
validating Order - order

But instead what I'm getting is this:

# In each validation, the object ID is NOT present, so hasn't saved to DB yet
validating Charge - a child 1 chg a
validating Charge - a child 1 chg b
validating Charge - a child 1 chg a ** repeat
validating Charge - a child 1 chg b ** repeat
validating AChild - a child 1
validating Charge - a child 2 chg 1
validating Charge - a child 2 chg 2
validating Charge - a child 2 chg 1 ** repeat
validating Charge - a child 2 chg 2 ** repeat
validating AChild - a child 2

validating Charge - a child 1 chg a ** repeat
validating Charge - a child 1 chg b ** repeat
validating Charge - a child 1 chg a ** repeat
validating Charge - a child 1 chg b ** repeat
validating AChild - a child 1       ** repeat
validating Charge - a child 2 chg 1 ** repeat
validating Charge - a child 2 chg 2 ** repeat
validating Charge - a child 2 chg 1 ** repeat
validating Charge - a child 2 chg 2 ** repeat
validating AChild - a child 2       ** repeat

validating Charge - b child chg
validating Charge - b child chg     ** repeat
validating BChild - b child

validating Charge - b child chg     ** repeat
validating Charge - b child chg     ** repeat
validating BChild - b child         ** repeat

validating Charge - order chg
validating Charge - order chg       ** repeat
validating Order - order

<then a bunch of insert happens into the database, but somehow afterwards validations repeat again??? these last round of validations are basically what I would expect as I wrote initially above>

# Note in these validations, each object's ID is defined (as in it's saved to DB)
validating Charge - a child 1 chg a
validating Charge - a child 1 chg b
validating AChild - a child 1
validating Charge - a child 2 chg 1
validating Charge - a child 2 chg 2
validating AChild - a child 2
validating Charge - b child chg
validating BChild - b child
validating Charge - order chg
validating Order - order    

What's causing the validation repetition, and how do I streamline this?

来源:https://stackoverflow.com/questions/38214813/nested-form-validation-statements-repeating-multiple-times

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!