Size: a a a

Saint P Ruby Community

2020 August 06

A

Artem in Saint P Ruby Community
Zamira Norova
Пока book не создан, у него нет айди. Соответственно у pages что в памяти, тоже нет book_id
По-моему валидация срабатывает до сохранения записи
источник

ZN

Zamira Norova in Saint P Ruby Community
Artem
По-моему валидация срабатывает до сохранения записи
Нет, .pages пустую ассоциацию отдает
источник

A

Artem in Saint P Ruby Community
Zamira Norova
Нет, .pages пустую ассоциацию отдает
А как проверка сама происходит?
источник

VA

Vyacheslav Alexeev in Saint P Ruby Community
Zamira Norova
Нет, .pages пустую ассоциацию отдает
потому что все значения еще в pages_attributes или как-то так, да?
источник

AP

Artem Pyankov in Saint P Ruby Community
А почему не сделать форм обжект ? Намного проще же все вручную сбилдить и проверить, зачем эти accept_nested_attributes вообще?
источник

ZN

Zamira Norova in Saint P Ruby Community
Artem Pyankov
А почему не сделать форм обжект ? Намного проще же все вручную сбилдить и проверить, зачем эти accept_nested_attributes вообще?
Скажем все это уже есть в таком виде. Просто повилось одно правило. Прямо сейчас мне не дадут все переписать
источник

ZN

Zamira Norova in Saint P Ruby Community
Artem
А как проверка сама происходит?
Как вариант в кастомном методе валидации
  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


где items это pages из примера выше
источник

VA

Vyacheslav Alexeev in Saint P Ruby Community
в валидации родительской модели посмотри что лежит в items_attributes, там должны быть сырые данные еще не созданных объектов
источник

AP

Artem Pyankov in Saint P Ruby Community
Можно попробовать в before_save чекать, добавлять ошибку и абортить коллбеки (как это делается зависит от версии рельсы). Но вообще это кривая дорожка, много боли получишь
источник

ZN

Zamira Norova in Saint P Ruby Community
Vyacheslav Alexeev
в валидации родительской модели посмотри что лежит в items_attributes, там должны быть сырые данные еще не созданных объектов
undefined local variable or method. Там точно items_attributes будет называться?
источник

VA

Vyacheslav Alexeev in Saint P Ruby Community
Zamira Norova
undefined local variable or method. Там точно items_attributes будет называться?
я не прав, так будет работать только items_attributes=
источник

A

Artem in Saint P Ruby Community
Zamira Norova
undefined local variable or method. Там точно items_attributes будет называться?
Вообще интересный кейс с валидацией ассоциаций в AR. Может поможет эта статья  https://www.homeonrails.com/2012/10/validating-nested-associations-in-rails/
источник

VA

Vyacheslav Alexeev in Saint P Ruby Community
Artem
Вообще интересный кейс с валидацией ассоциаций в AR. Может поможет эта статья  https://www.homeonrails.com/2012/10/validating-nested-associations-in-rails/
там чёта сильно ранняя рельса 🙂
источник

VA

Vyacheslav Alexeev in Saint P Ruby Community
в 6-й рельсе при присваивании items_attributes = [{..}] сырые данные сразу сериализируются в массив новых объектов ассоциированной модели (с каких пор так - не знаю)
источник

ZN

Zamira Norova in Saint P Ruby Community
Artem
Вообще интересный кейс с валидацией ассоциаций в AR. Может поможет эта статья  https://www.homeonrails.com/2012/10/validating-nested-associations-in-rails/
Не совсем то. Это метод валидации, через который проходит каждая из ассоциаций. Все равно спасибо
источник

A

Anton in Saint P Ruby Community
Я не пробовал, но может это поможет https://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-i-validates_associated (для 6той рельсы)
источник

ZN

Zamira Norova in Saint P Ruby Community
У меня 5.0 пока 😭
источник

ZN

Zamira Norova in Saint P Ruby Community
Проект начинали на 3. Всегда вовремя обновлялись. Но с 6 что-то затянулось
источник

A

Anton in Saint P Ruby Community
а почему dry не хотите занести? Так схему со всеми вложениями описать и её чекать, очень хорошо бы работало. Еще это все вынести в отдельный команд-объект который создавать будет запись, чтобы совсем было явно
источник

A

Anton in Saint P Ruby Community
ну и еще как вариант не передавать с фронта items_attributes, а передавать скажем items как свойство основного объекта, валидировать их и уже формировать из них _attributes. В объекте формы как выше предлагали
источник