rake db:migrate正确运行所有迁移

时间:2009-11-16 11:28:10

标签: ruby-on-rails migration

我在这里对Ruby on Rails相当新。

我有2个提供的迁移文件。第一个以001为前缀,为该表创建一个表和一些列。下一个迁移文件(以002为前缀)将行插入到文件001中创建的表中。

正确运行迁移(rake db:migrate in command line)会创建表,但不会插入任何问题的数据。插入的代码如下所示(除了更多的Student.create语句,

class AddStudentData < ActiveRecord::Migration
  def self.up
        ...
   Student.create(:name => "Yhi, Manfredo", :gender => "M")
        ...
  end

  def self.down
    Student.delete_all
  end
end

我的理解是学生是一个模范对象,所以我的学生模型看起来像这样,

class Student < ActiveRecord::Base
end

我是否需要在Student中明确定义一个create方法,或者是给出了什么? (这个项目是用脚手架制作的)

感谢。

编辑1:我使用了达米恩的建议并拨打了create!而不是create但得到了相同的回复。然后我做了什么来看看代码是否达到了那么远就是这个,

Student.create12312313!(:name => "foo", :gender => "M")

这显然是无效的代码,迁移没有抛出任何错误。

Edit2:找到答案。 schema_migrations表的版本设置为3,我只有3个不同的迁移文件,因此它从未运行过任何迁移文件。这就是为什么没有任何东西在进行更新,而且我所使用的伪造的东西从未抛出错误。第一次没有插入学生数据的原因是因为某个表已经在数据库中,并且在我第一次迁移时导致了冲突。所以我真正想要的不是db:migrate,而是db:reset好几个小时。

3 个答案:

答案 0 :(得分:1)

create方法继承自ActiveRecord::Base 所以不,你不需要定义它。

无法包含数据的一个原因是您的验证未通过。
您可以使用create!代替create轻松查看错误,从而无法包含您的数据 因此,如果无法创建模型,则会抛出异常并且迁移将失败。

答案 1 :(得分:0)

您可能希望查看rails 2.3.4中的数据种子。你的rails迁移真的在运行001_create_whatever.rb吗?或者你只是以此为例?自2.2.2(iirc)迁移以来一直使用时间戳,例如10092009 .... create_whatever.rb

你的导轨版本多久了?

答案 2 :(得分:0)

如果他们的架构号在数据库中,则不会运行迁移。

对于较旧版本的rails,将会有一行执行最高迁移。

对于较新的版本,每次迁移都会获得一个唯一的时间戳作为其版本号,并在添加时获得schema_migrations中自己的行。