在一个已经部署的应用程序中,在我的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
还没有运行。
因此,AddStateCodeToStates
迁移中的UPDATE xxx
没有可处理的数据(states
表为空,因为数据将从seeds.rb
填充),因此state_code
保持为NULL
。
所以我的问题是(它们是如此相关,很抱歉没有把它们作为单独的问题来问):
- 在重新创建数据库时(在
states
表中包含数据之后),如何填充state_codes
- 当部署的应用程序上的
rake db:migrate
(seeds.rb
不在rake db:migrate
上运行)时,如何获取state_codes
- 我应该一开始就不使用
seeds.rb
(而是将数据放入迁移中)吗
就像Rails中的许多东西一样,您有很多选项,但是。。。。一般的做法是在CCD_ 16中放入必要的应用数据。您应该以一种可以多次运行而不添加额外记录的方式编写seeds.rb,例如
State.find_or_create_by_state(:state => 'state_name_here', ':state_code => 'code here')