Rails, Удалить столбец из таблицы и делегировать его в связанную таблицу и использовать делегированный столбец в предложении where - PullRequest
1 голос
/ 22 апреля 2020

В настоящее время я работаю над продуктом, в котором по некоторым причинам мы решили уничтожить столбец email из указанной таблицы c и затем делегировать этот столбец в связанную таблицу, используя метод делегата активной записи

* 1003. *https://apidock.com/rails/Module/delegate

Мой вопрос здесь будет о том, какой подход следует использовать, чтобы убедиться, что все предложения where, использующие столбец email, также делегированы , Потому что в основном нужно много времени, чтобы проверить все места, где мы использовали table.where(dropped_column: value)

Пример

class Station < ActiveRecord::Base
  has_one :contact
  delegate :email, to: :contact
end

class Contact < ActiveRecord::Base
  belongs_to :station
end

Я знаю, что можно переключаться все запросы от Station.where(email: value) до Station.joins(:contact).where('contacts.email': value), но этот подход займет очень много времени, и предложение where может быть написано разными способами, поэтому поиск по источнику кода и его обновление не достаточно эффективно, чтобы охватить все случаи.

Если кто-то сталкивался с подобной ситуацией и сумел решить ее таким образом, чтобы сэкономить время и ошибки, я буду очень рад услышать, какие подходы вы использовали.

Спасибо.

Версия Rails: '5.2.3'

1 Ответ

2 голосов
/ 22 апреля 2020

каков подход, которому нужно следовать, чтобы убедиться, что все предложения where, использующие столбец электронной почты, также делегированы

Вы не можете «делегировать» команды SQL , Вам нужно обновить их все.

Я знаю, что можно переключить все запросы с Station.where(email: value) на Station.joins(:contact).where('contacts.email': value), но этот подход займет очень много времени

Да, это то, что вам нужно сделать, извините!

Если кто-то сталкивался с подобной ситуацией и смог решить ее таким образом, чтобы сэкономить нам время и ошибки, я буду очень рад услышать, что подходы, которым вы руководствовались.

Прежде чем удалить столбец, вы можете сначала сделать это:

class Station < ActiveRecord::Base
  self.ignored_columns = ['email']

  has_one :contact
  delegate :email, to: :contact

  # ...
end

Таким образом, вы можете остановить приложение от возможность доступа к столбцу без фактического удаления его из базы данных (например, «мягкое удаление»), что облегчает его возврат.

Сделайте это на ветке и сделайте все спецификации зелеными. (Если у вас хорошее тестовое покрытие, все готово! Но если у вас плохое покрытие, после развертывания возможны ошибки ...)

Если после развертывания произойдет ошибка, вы могли бы верните весь PR или просто временно закомментируйте ignored_columns, пока вы исправляете sh.

Затем, наконец, как только ваше приложение работает без ошибок, отбросьте столбец.

...