ruby-on-rails 如何在rails迁移中添加一些insert?

sqserrrh  于 11个月前  发布在  Ruby
关注(0)|答案(5)|浏览(161)

在创建一个表(通过迁移)之后,我想直接插入一些条目。我必须如何为此编写迁移?
谢谢

v6ylcynt

v6ylcynt1#

不要。如果您要查找种子数据,则应该使用db/seeds.rbrake db:seedMore info in this Railscast

旁注:始终确保db/seeds.rb中的代码是幂等的,即重新运行种子应该总是安全的。
但是,如果您必须在迁移中插入或修改数据(这是合法的用例),最好使用SQL语句。您的模型类不能保证在未来版本的应用程序中仍然以相同的形式存在,并且如果您直接引用模型类,则将来从头开始运行迁移可能会产生错误。

execute "insert into system_settings (name, label, value) values ('notice', 'Use notice?', 1)"

字符串

km0tfn4u

km0tfn4u2#

**更新:**正确答案: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

字符串

7fhtutme

7fhtutme3#

编辑:请注意-上面的海报是正确的,你不应该在迁移中填充数据库。不要使用它来添加新数据,只修改数据作为更改架构的一部分。

对于很多事情来说,使用原始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)中,所以在保护模型中声明的多态关联将无法正确工作。
有关可用选项的更详细概述,请参阅此处:http://railsguides.net/2014/01/30/change-data-in-migrations-like-a-boss/

6jjcrrmo

6jjcrrmo4#

创建新的迁移文件,如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

字符串

创建表时
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


Ref:- http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

izkcnapc

izkcnapc5#

在迁移中有一些关于使用模型的参考:Rails迁移特性的主要目的是发出命令,使用一致的过程修改模式。迁移也可以用于添加或修改数据。这在不能销毁和重新创建的现有数据库中很有用,例如生产数据库。
播种应该是idempotent,如公认的答案所述。这意味着即使只是意外,它们也应该在生产中安全运行。因此,find_or_create_by方法可以也应该用于这些情况。
然后,我们可以在迁移中利用模型,如下所示:

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

字符串

  • 就像我们正在做的任何事情一样,特别是在生产中,我们应该带着理解,谨慎和意图去做。

此方法的高级用法可用于调整生产数据库模式和模型,以反映和构建对较新模型的新引用。使用此方法可在一次迁移中完成此操作,特别是与以下方法配合使用时:

  • 添加引用
  • 复位列信息

相关问题