2014-01-13 6 views
1

Приложение My Ruby_2 + Rails_4 + Postgres_9.2 содержит десятки моделей. Недавно CR потребовал добавить два новых поля ко всем моим моделям. Я знаю, что я могу кропотливо создать миграцию, которая будет индивидуально «добавить_колонку» к каждой из моих моделей. Есть ли более простой способ сделать то же самое, где мне не нужно будет это делать?Rails 4: Как добавить столбец ко всем моделям в приложении?

ответ

2
def self.up 
    ActiveRecord::Base.connection.tables.each do |table| 
    next if table == "schema_migrations" 
    add_column table, :column_name, :column_type 
    end 
end 

EDIT: (получение имени таблицы из моделей)

def self.up 
    Rails.application.eager_load! 
    ActiveRecord::Base.descendants.each do |model| 
     add_column model.table_name, :column_name, :column_type 
    end 
end 
+0

Привет Vimsha, ваш код работает отлично, но добавляет столбец ко всем таблицам в БД, включая таблицы отношений. Я хочу добавить их только в таблицы моих моделей (те, которые расширяют ActiveRecord :: Base). Можете ли вы улучшить это. Чтобы снова напомнить вам, я использую Rails 4. Спасибо! – user163861

+0

@ user163861: Изменен мой ответ тем, что вы просите – usha

0

Добавьте миграции и петлю через все таблицы:

def self.up 
    [:table_name1, :table_name2, :table_name3, ...].each do |table_name| 
    add_column table_name, :column1, :string 
    add_column table_name, :column2, :string 
    end 
end 
1
def tables 
    (ActiveRecord::Base.connection.execute 
    "SELECT table_name FROM INFORMATION_SCHEMA.TABLES 
     WHERE table_schema = '#{ActiveRecord::Base.connection.current_database}' 
     AND table_type = 'BASE TABLE'").to_a.flatten 
end 

def self.up 
    tables.each do |table| 
    add_column table, :a_column1, :a_type 
    add_column table, :a_column2, :a_type 
    end 
end 
Смежные вопросы