1

我试图在我的迁移中创建一条记录,但我遇到了麻烦,我以前做过(在我的高级开发人员的帮助下),我试图复制他所做的,但它似乎没有在数据库中创建记录。 ..

这是迁移文件

class PageEditor < ActiveRecord::Base; end

def create_initial_record
  PageEditor.create({
    :title => 'Events & Training',
            :content => ''
  })
  PageEditor.create({
    :title => 'Roof Mount - Training',
            :content => ''
  })
end

class CreatePageEditors < ActiveRecord::Migration
  def up
    create_table :page_editors do |t|
      t.string :title
      t.text :content

      t.timestamps
    end

    create_initial_record
  end

  def down
drop_table :page_editors
  end
 end

所以我添加了屋顶安装 - 训练部分,然后运行 ​​rake db:migrate 但它不会创建记录,也不会显示在我的索引页面上......

4

4 回答 4

7

请参阅http://edgeguides.rubyonrails.org/migrations.html#migrations-and-seed-data

更好的方法是使用 Rails 的“种子”功能:在db/seeds.rb文件中:

PageEditor.create({:title => 'Events & Training', :content => ''})
PageEditor.create({:title => 'Roof Mount - Training', :content => ''})

然后运行rake db:seed

于 2013-04-24T20:38:43.560 回答
4

那么简单的解决方案是编写另一个迁移,例如add_values_to_page_editors

并且在那

class AddValuesToPageEditors < ActiveRecord::Migration
  def up
    page_editor1 = PageEditor.create!({:title => 'Events & Training', :content => ''})
    page_editor2 = PageEditor.create!({:title => 'Roof Mount - Training', :content => ''})
  end

  def down
    page_editor1 = PageEditor.find_by_title( 'Events & Training' )
    page_editor1.destroy
    page_editor2 = PageEditor.find_by_title( 'Roof Mount - Training' )
    page_editor2.destroy       
  end
end
于 2013-04-24T20:42:46.633 回答
4

PageEditor.reset_column_information创建表后尝试。否则 ActiveRecord 将根据旧数据进行操作。

PageEditor您还应该考虑在迁移中嵌入骨架版本。这可以防止验证问题导致您的create调用出错,或者模型的更高版本干扰没有预料到的旧迁移。例子:

class ManufactureWidgets < ActiveRecord::Migration
  class Widget < ActiveRecord::Base; end
  def change
    create_table :widgets do |t|
      t.timestamps
    end

    Widget.reset_column_information
    Widget.create!
  end
end

重要的是要记住并非总是运行迁移来构建数据库。它们应该用于从一种模式迁移到另一种模式,并且在更稳定的环境中部署时,通常会rake db:schema:load运行schema.rb.

不幸的是,种子数据在 Rails 中的实现很差,但是有许多第三方库在处理这个问题上有着不同的理念。如果您是已经在迁移中嵌入种子数据的项目的初级开发人员,您应该将其标记给高级开发人员并提出更改;当那不合适或不可行时,简单地遵循既定模式是合适的。

于 2013-04-24T21:08:15.923 回答
2

在您的迁移中,而不是

create_initial_record

利用

PageEditor.create_initial_record!

希望这会奏效。这是您想要的解决方案:-)

于 2013-04-24T20:55:21.657 回答