如何在rails迁移中添加一些插入?

时间:2010-04-19 13:06:17

标签: ruby-on-rails migration

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

感谢

5 个答案:

答案 0 :(得分:83)

<强>不即可。如果您要查找种子数据,则应使用db/seeds.rbrake 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