Как добавить новый столбец для каждой модели? - PullRequest
1 голос
/ 16 января 2020

с какой миграцией я могу добавить столбец к каждой модели сразу? Это было бы удобно практически каждый раз, когда вы забыли добавить поле, так как большую часть времени поле, которое вы хотите добавить, не ограничивается только одной моделью. Как "электронная почта" В этом случае я забыл добавить поле "заказ".

Спасибо

Ответы [ 2 ]

3 голосов
/ 16 января 2020

Вы можете сделать следующее -

def change
  tables = [:users, :products, :addresses]

  tables.each do |table_name|
    add_column table_name, :order, :integer
  end
end

Это называется групповой миграцией

2 голосов
/ 16 января 2020

Отвечая на ваш первый вопрос «При какой миграции я могу добавить столбец к каждой модели сразу?» . Ответ: нет. Миграции Rails - это способ согласованно изменять схемы базы данных во времени.

Миграции Rails - это Ruby классы, использующие методы Rails в качестве инструкций для изменения вашей базы данных по мере необходимости. Таким образом, ваш вопрос может быть лучше сформулирован как «Как я могу создать миграцию для добавления столбца в каждую модель сразу?»

ИМХО Не думаю, что будут какие-то конкретные c метод для этого, так как реквизмент довольно индивидуален, но, в зависимости от вашей версии Rails, вы можете получить все ApplicationRecord.descendants:

Zeitwerk::Loader.eager_load_all
ApplicationRecord.descendants.map { |table| table.name.downcase.pluralize }.each do |table|
  add_column table, :logdate, :datetime
end

или все эти таблицы из базы данных, которые могут быть safe_constantized :

ActiveRecord::Base.connection.tables.map do |table|
  table.classify.safe_constantize
end.reject(&:nil?).each do |table|
  add_column table, :logdate, :datetime
end

Таким образом, вы получаете имя каждой таблицы / модели и используете его в качестве первого аргумента для add_column.

Разница в том, что в Rails 6 загрузчик кода по умолчанию - Zeitwerk, поэтому вы можете загружать все зависимости проекта. В других версиях вы могли бы сделать то же самое, но используя Rails.application.eager_load!.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...