Я выполняю рефакторинг своего приложения Rails 5.2 таким образом, чтобы одна модель (OrigM) была разделена на две (OrigM, NewM).В кодовой базе есть код, который выполняет update
для объектов OrigM, и я хочу, чтобы это теперь приводило к специализированному поведению, при котором связанные объекты OrigM и NewM обновляются соответствующим образом.
Это кажется простым способомсделать это значит переопределить update
в модели OrigM, но попытка сделать это простым способом приводит к бесконечной рекурсии, потому что, очевидно, даже метод класса OrigM.update(id, new_attrs)
под капотом просто find
использует объект с id id
и вызов update
в качестве метода экземпляра для него.
Я нашел пару других способов, которые могли бы, возможно, сделать эту работу, хотя я еще не полностью их протестировал: (1) Обновить OrigMатрибутов, вызывая write_attribute
для них по отдельности (кажется, что это не позволит мне проверить валидацию), или (2)
self.assign_attributes(new_attrs) ## resulting in "dirty" object, then
self.save!
Я склоняюсь к этому второму решению, так как кажется, что оно должнобыть достаточно близким к функционально идентичному тому, что делает стандарт update
.
РЕДАКТИРОВАТЬ: я понял, что никто не может на самом деле answer это, если я не задаю вопрос, поэтому теперь я переименую его в:
ВОПРОС: Должен ли я или не должен переопределять метод AR update
(в классе OrigM)?
Комментаторы сказали: «Не делай этого, иначе ты будешь оскорблен» (что, честно говоря, я был уверен, что кто-то скажет, лол).Но ... это действительно такое преступление?Есть ли «убийственная» причина не делать этого (с чем не поспоришь)?Или это просто смутно рекомендуемая лучшая практика?
Также: «почему бы просто не определить новый метод, если он делает что-то другое?»Ну ... я думаю, мне нужно больше рассказать о моделях ... Я не хочу пытаться дать реальный код, потому что он слишком сложный.Достаточно сказать: большая часть кода по-прежнему взаимодействует с объектами OrigM и не будет знать о NewM.NewM был нужен только архитектурно, потому что мне нужно было разрешить нескольким OrigM совместно использовать (принадлежать) одному NewM, чтобы избежать дублирования данных.Поэтому я хотел бы позволить большей части остального кода поддерживать иллюзию, что все еще существует только OrigM, и иметь возможность обновлять его как обычно.Это похоже на самое элегантное решение для меня.Если я создам новый OrigM#myupdate
, будущие разработчики (включая меня) могут проклясть меня, потому что они пытались сделать простой update
, и это сломало вещи.А разве не нужно знать, что существует специальная функция обновления, столь же запутанная, как необходимость знать, что обновление AR было переопределено?