Отвечая на ваш первый вопрос «При какой миграции я могу добавить столбец к каждой модели сразу?» . Ответ: нет. Миграции 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!
.
Вторая версия работала бы без необходимости загружать модели в виде зависимостей, так как она делает запрос, запрашивая их таблицы, а затем отображает их как константы.