如何在迁移中向新创建的列添加数据?

时间:2011-05-24 18:25:58

标签: ruby-on-rails-3 seed

在已部署的应用程序中,在我的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_codesstates表中包含数据后)?
  2. 如果部署的应用state_codes rake db:migrate seeds.rb未在rake db:migrate上运行,我将如何获得seeds.rb
  3. 我是否应该首先使用{{1}}(而是将数据放入迁移中)?

1 个答案:

答案 0 :(得分:3)

与Rails中的许多内容一样,您有很多选择,但......通常的做法是将必要的应用程序数据放在seeds.rb中。您应该以一种可以多次运行而不添加额外记录的方式编写seeds.rb,例如

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