Как добавить данные во вновь созданный столбец в процессе миграции? - PullRequest
1 голос
/ 24 мая 2011

В уже развернутом приложении, в моем seeds.rb, у меня есть следующее:

State.create!(:state => "Alabama")
State.create!(:state => "Delaware")
...

Теперь я хотел добавить двухбуквенный код для каждого штата.

Итак, я сделал миграцию так:

class AddStateCodeToStates < ActiveRecord::Migration
  def self.up
    add_column :states, :state_code, :string

    update(<<-SQL
    UPDATE states SET state_code='WA' where state = 'Washington'
    SQL
    )
    ...lots of these SQL statement...
  end

  def self.down
  end
end

Проблема:

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

Таким образом, UPDATE xxx в миграции AddStateCodeToStates не имеет данных для работы (таблица states пуста, поскольку данные будут заполняться из seeds.rb), поэтому state_code остается NULL .

Итак, мои вопросы (они так связаны, извините, что не задавали их как каждый отдельный вопрос):

  1. Как заполнить state_codes при воссоздании базы данных (после того, как в таблице states есть данные)?
  2. Как получить state_codes, когда rake db:migrate на развернутом приложении (seeds.rb не работает на rake db:migrate)
  3. Разве я не должен был использовать seeds.rb во-первых (и вместо этого поместить данные в миграции)?

1 Ответ

3 голосов
/ 24 мая 2011

Как и многие вещи в Rails, у вас есть много вариантов, но .... общая практика - поместить необходимые данные приложения в seeds.rb. Вы должны написать seed.rb таким образом, чтобы его можно было запускать несколько раз без добавления дополнительных записей, например,

State.find_or_create_by_state(:state => 'state_name_here', ':state_code => 'code here')

...