У меня есть 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
и изначально у меня есть:
и когда передайте пассажирам_атрибуты для обновления клиента (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. Как я могу это исправить?
Перенос логики проверки от ребенка к отцу должен решить проблему.
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
Ваша проблема в том, что дети спасаются раньше родителей. В методе вашего контроллера для обновления записей вам необходимо создать 2 отдельных метода для индивидуального обновления родительской и дочерней записи. Если вы сначала обновите родительский элемент, подтвердите это, а затем попробуете дочерний элемент, вы должны получить желаемый результат.