Проверка правильности вложенных атрибутов Rails сначала сохраняет родителя - PullRequest
0 голосов
/ 30 октября 2018

У меня есть 2 модели, такие как:

class Father < ActiveRecord::Base
    has_many :children
    accepts_nested_attributes_for :children
end



class Child < ActiveRecord::Base
    belongs_to :father
    validate :validate_money

    def validate_money
      children = Child.where(id: self.father.id)
      sum_of_children_pocket_money = my_func # function for getting sum of all pocket money of all children
      if sum_of_children_pocket_money > self.father.money
        errors.add(:pocket_money, "My error message!!!")
      end
    end
  end

и изначально у меня есть:

и когда pass_attributes для обновления клиента (id = 1), как

{
  id: 1,
  name: "Father 1",
  money: 1000,
  children: [
    {
      name: "Child 1",
      id: 1,
      pocket_money: 500
    }
  ]
}

и затем я отправляю для обновления:

{
  id: 1,
  name: "Father 1",
  money: 2000,
  children: [
    {
      name: "Child 1",
      id: 1,
      pocket_money: 1500
    }
  ]
}

Итак, я получаю ошибку в своей проверке, потому что она начинает sum_of_children_pocket_money > self.father.money сравнение и sum_of_children_pocket_money равно 1500, но self.father.money все еще 1000. Как я могу это исправить?

1 Ответ

0 голосов
/ 30 октября 2018

Перемещение логики проверки от Ребенка к Отцу должно решить проблему.

class Father < ActiveRecord::Base
  has_many :children
  accepts_nested_attributes_for :children
  validate :validate_money

  def validate_money
    children = Child.where(id: id)
    sum_of_children_pocket_money = my_func # function for getting sum of all pocket money of all children
    if sum_of_children_pocket_money > money
      errors.add(:pocket_money, "My error message!!!")
    end
  end
end



class Child < ActiveRecord::Base
  belongs_to :father
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...