创建表(通过迁移)后,我想直接插入一些条目。我该如何为此编写迁移?
感谢
答案 0 :(得分:83)
<强>不即可。如果您要查找种子数据,则应使用db/seeds.rb
和rake db:seed
代替。 More info in this Railscast
附注:始终确保db/seeds.rb
中的代码是幂等的。即重新运行种子应始终是安全的。
但是,如果您必须在迁移中插入或修改数据(有合法的用例),最好使用SQL语句。在未来的应用程序版本中,不保证您的模型类仍以相同的形式存在,如果直接引用模型类,将来从头开始运行迁移可能会产生错误。
execute "insert into system_settings (name, label, value) values ('notice', 'Use notice?', 1)"
答案 1 :(得分:8)
<强>更新强> 这是正确答案:https://stackoverflow.com/a/2667747/7852
以下是ruby on rails api的示例:
class AddSystemSettings < ActiveRecord::Migration
# create the table
def self.up
create_table :system_settings do |t|
t.string :name
t.string :label
t.text :value
t.string :type
t.integer :position
end
# populate the table
SystemSetting.create :name => "notice", :label => "Use notice?", :value => 1
end
def self.down
drop_table :system_settings
end
end
答案 2 :(得分:5)
编辑:请注意 - 上面的海报是正确的,您不应该在迁移中填充数据库。不要使用它来添加新数据,只是在更改架构时修改数据。
对于很多东西,使用原始SQL会更好,但是如果你需要在迁移过程中插入数据(例如,在将表分成多个表时进行数据转换),并且你想要一些默认的AR东西与方便的DB独立转义一样,您可以定义模型类的本地版本:
class MyMigrationSucksALittle < ActiveRecord::Migration
class MyModel < ActiveRecord::Base
# empty guard class, guaranteed to have basic AR behavior
end
### My Migration Stuff Here
### ...
end
请注意,这对于简单情况最有效;由于新类位于不同的命名空间(MyMigrationSucksALittle::MyModel
),因此在guard模型中声明的多态关联将无法正常工作。
可用选项的更详细概述位于:http://railsguides.net/2014/01/30/change-data-in-migrations-like-a-boss/
答案 3 :(得分:4)
创建一个新的迁移文件 047_add_rows_in_system_settings.rb
class AddRowsInAddSystemSettings < ActiveRecord::Migration
def self.up
SystemSetting.create{:name => "name1", :label => "Use notice?", :value => 1}
SystemSetting.create{:name => "name2", :label => "Use notice?", :value => 2}
end
def self.down
SystemSetting.delete_all
end
end
OR
创建表时
046_system_settings.rb
class AddSystemSettings < ActiveRecord::Migration
def self.up
create_table :system_settings do |t|
t.string :name
t.string :label
t.text :value
t.string :type
t.integer :position
end
SystemSetting.create :name => "notice", :label => "Use notice?", :value => 1
end
def self.down
drop_table :system_settings
end
end
参考: - http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
答案 4 :(得分:0)
使用可以使用种子数据,这是一个很好的方法! http://railscasts.com/episodes/179-seed-data