Как я могу указать, что все таблицы должны содержать определенные поля? - PullRequest
4 голосов
/ 25 февраля 2011

Предположим, что я уже определил свою базу данных с большим количеством таблиц (около 40). Теперь я понимаю, что хочу добавить определенные столбцы в каждую таблицу. Ради примера пусть будет created_by и updated_by.

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

Я использую рельсы 2.3.8

Ответы [ 3 ]

11 голосов
/ 25 февраля 2011

Вы можете сгенерировать одну миграцию и поместить в нее этот код. Он даст вам массив всех таблиц (за исключением таблицы "schema_migrations", которую автоматически создает Rails), а затем добавит столбцы к каждой из них.

tables = ActiveRecord::Base.connection.tables - ["schema_migrations"]
tables.each do |table|
  add_column table, :created_by, :integer
end
1 голос
/ 25 февраля 2011

Вам не нужно сорок миграций.Вы можете сделать только одну миграцию, например:

def self.up
  %w(table1 table2 table3).each do |table_name|
    ActiveRecord::Base.connection.execute "ALTER TABLE #{table_name} ADD created_by int, updated_by int"
  end
end
0 голосов
/ 30 июля 2012

Этот вопрос / ответ помог мне исправить кодировку всех таблиц ...

class FixCharacterSet < ActiveRecord::Migration
  def up
    tables = ActiveRecord::Base.connection.tables - ["schema_migrations"]
    tables.each do |table|
        ActiveRecord::Base.connection.execute "ALTER TABLE #{table} CONVERT TO CHARACTER SET utf8 COLLATE 'utf8_general_ci';"
    end
  end

  def down
  end
end
...