class MyMigrationSucksALittle < ActiveRecord::Migration
class MyModel < ActiveRecord::Base
# empty guard class, guaranteed to have basic AR behavior
end
### My Migration Stuff Here
### ...
end
class CreateMyModel < ActiveRecord::Migration[7.0]
def up
create_table :my_model do |t|
# table code here
end
MyModel.find_or_create_by(**my_model_attributes)
end
def down
drop_table :my_model
end
end
5条答案
按热度按时间v6ylcynt1#
不要。如果您要查找种子数据,则应该使用
db/seeds.rb
和rake db:seed
。More info in this Railscast。旁注:始终确保
db/seeds.rb
中的代码是幂等的,即重新运行种子应该总是安全的。但是,如果您必须在迁移中插入或修改数据(这是合法的用例),最好使用SQL语句。您的模型类不能保证在未来版本的应用程序中仍然以相同的形式存在,并且如果您直接引用模型类,则将来从头开始运行迁移可能会产生错误。
字符串
km0tfn4u2#
**更新:**正确答案:https://stackoverflow.com/a/2667747/7852
下面是一个ruby on rails api的例子:
字符串
7fhtutme3#
编辑:请注意-上面的海报是正确的,你不应该在迁移中填充数据库。不要使用它来添加新数据,只修改数据作为更改架构的一部分。
对于很多事情来说,使用原始SQL会更好,但是如果你需要插入数据作为迁移的一部分(例如,当将一个表分解为多个表时进行数据转换),并且你想要一些默认的AR东西,比如方便的DB独立转义,你可以定义模型类的本地版本:
字符串
请注意,这最适合简单的情况;因为新类位于不同的名称空间(
MyMigrationSucksALittle::MyModel
)中,所以在保护模型中声明的多态关联将无法正确工作。有关可用选项的更详细概述,请参阅此处:http://railsguides.net/2014/01/30/change-data-in-migrations-like-a-boss/
6jjcrrmo4#
创建新的迁移文件,如047_add_rows_in_system_settings.rb
字符串
或
创建表时
046_system_settings.rb
型
Ref:- http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
izkcnapc5#
在迁移中有一些关于使用模型的参考:Rails迁移特性的主要目的是发出命令,使用一致的过程修改模式。迁移也可以用于添加或修改数据。这在不能销毁和重新创建的现有数据库中很有用,例如生产数据库。
播种应该是
idempotent
,如公认的答案所述。这意味着即使只是意外,它们也应该在生产中安全运行。因此,find_or_create_by
方法可以也应该用于这些情况。然后,我们可以在迁移中利用模型,如下所示:
字符串
此方法的高级用法可用于调整生产数据库模式和模型,以反映和构建对较新模型的新引用。使用此方法可在一次迁移中完成此操作,特别是与以下方法配合使用时: