def total_equal_items_total_sum items_total = items.sum("quantity*unit_price") if total != items_total errors.add(:total, "Should be equal to #{items_total}") end end
Можно попробовать в before_save чекать, добавлять ошибку и абортить коллбеки (как это делается зависит от версии рельсы). Но вообще это кривая дорожка, много боли получишь
в 6-й рельсе при присваивании items_attributes = [{..}] сырые данные сразу сериализируются в массив новых объектов ассоциированной модели (с каких пор так - не знаю)
а почему dry не хотите занести? Так схему со всеми вложениями описать и её чекать, очень хорошо бы работало. Еще это все вынести в отдельный команд-объект который создавать будет запись, чтобы совсем было явно
ну и еще как вариант не передавать с фронта items_attributes, а передавать скажем items как свойство основного объекта, валидировать их и уже формировать из них _attributes. В объекте формы как выше предлагали