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

xav*_*r23 36 migration ruby-on-rails

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

谢谢

Rya*_*ary 87

不要.如果您正在寻找种子数据,您应该使用db/seeds.rbrake db:seed不是. 更多信息在这个Railscast中.

附注:始终确保代码db/seeds.rb是幂等的.即重新运行种子应始终是安全的.

但是,如果必须在迁移中插入或修改数据,则最好使用SQL语句.在未来的应用程序版本中,不保证您的模型类仍以相同的形式存在,如果直接引用模型类,将来从头开始运行迁移可能会产生错误.

execute "insert into system_settings (name, label, value) values ('notice', 'Use notice?', 1)"
Run Code Online (Sandbox Code Playgroud)

  • 你是如此令人难以置信的正确,这是荒谬的.我只是完全搞砸了大部分时间,认为编写用于播放表的迁移是可以的.可怕.可怕.可怕.如果您不相信这个答案,请相信我"当您更新代码时,您的模型会随着时间的推移而变化".当这种情况发生时,您的播种迁移会变得拙劣,并且您会丢失数据....(幸运的是,我将事情做好了).现在我只需要弄清楚如何在事后自动将数据放回去. (7认同)
  • @AliArslan你显然不了解迁移的基本概念.如果您正在进行迁移,那么架构当然会与迁移运行时的预期架构相匹配; 否则,迁移不需要运行. (4认同)
  • 使用创建其表的迁移定位数据是有好处的.空洞时,桌子可能毫无意义.也许你想将rails的db版本扩展到数据.也许您认为所有种子/配置数据只使用一个文件是loco(它是!).如果您唯一的理由是通过模型进行操作是不好的,那么您不需要说教"不要"在迁移中添加数据.我只是这样说,因为这是一个大量的问题,知道怎么做得好就是海报问的问题. (3认同)
  • 我理解这背后的原因,但在我看来,可能有合理的理由来添加/更新数据.例如,我有一个迁移,创建一个新模型将其与预先存在的模型相关联.我想为现有模型的每个实例插入新模型的新实例.创建表并在同一个地方插入该表的初始数据是否有意义?我没有播种整个数据库,只有这一张桌子. (3认同)
  • -1由于缺乏详细的说明,通过示例(s),为什么通过迁移文件添加数据不是一个好主意.你链接到的Railscast视频也缺乏这个.它只涉及这一主题:"我不是这种方法的粉丝.我更喜欢让迁移只关注改变数据库模式." 听起来很主观.另一个链接似乎已经死了.您还提到最好使用SQL语句.再次,为什么?一旦你添加了更好的解释,我将删除downvote.示例示例示例. (2认同)

Ju *_*ira 10

更新: 这是正确答案: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
Run Code Online (Sandbox Code Playgroud)

  • 使用模型是不好的做法,因为模型随着时间的推移而变化,根据下面的响应 - 使用SQL (6认同)
  • 正如其他人所说,这不是正确的方法.请参阅此答案:http://stackoverflow.com/a/2667747/7852 (3认同)

小智 5

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

对于很多东西,使用原始SQL会更好,但是如果你需要在迁移过程中插入数据(例如,在将表分成多个表时进行数据转换),并且你想要一些默认的AR东西,比如方便的数据库-independent escaping,您可以定义模型类的本地版本:

class MyMigrationSucksALittle < ActiveRecord::Migration
  class MyModel < ActiveRecord::Base
    # empty guard class, guaranteed to have basic AR behavior
  end

  ### My Migration Stuff Here
  ### ...

end
Run Code Online (Sandbox Code Playgroud)

请注意,这对于简单情况最有效; 由于新类位于不同的名称空间(MyMigrationSucksALittle::MyModel)中,因此在保护模型中声明的多态关联将无法正常工作.

有关可用选项的更详细概述位于:http://railsguides.net/2014/01/30/change-data-in-migrations-like-a-boss/