在迁移中创建初始记录

时间:2013-04-24 20:28:45

标签: ruby-on-rails ruby ruby-on-rails-3

我试图在我的迁移中创建一条记录但是我遇到了麻烦我之前已经完成了(在我的高级开发人员的帮助下)并且我试图复制他所做的但是它似乎没有创建记录数据库......

继承迁移文件

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:3)

创建表格后尝试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中的实现很差,但是有很多第三方库在处理这个问题时有不同的理念。如果您是已经在迁移中嵌入种子数据的项目的初级开发人员,您应该将其标记给高级开发人员并提出更改;如果这是不恰当或不可行的,那么简单地遵循既定模式是恰当的。

答案 3 :(得分:2)

在您的迁移中而不是

  

create_initial_record

使用

  

PageEditor.create_initial_record!

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