Должен ли я переопределить метод update () Activerecord? - PullRequest
0 голосов
/ 02 апреля 2019

Я выполняю рефакторинг своего приложения 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 было переопределено?

...