【问题标题】:rake db:migrate running all migrations correctlyrake db:migrate 正确运行所有迁移
【发布时间】:2009-11-16 11:28:09
【问题描述】:

我对 Ruby on Rails 还很陌生。

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

运行迁移(命令行中的 rake db:migrate)会正确创建表,但不会插入任何有问题的数据。插入的代码如下所示(除了更多 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

我的理解是Student是一个模型对象,所以我的Student模型是这样的,

class Student < ActiveRecord::Base
end

我是否需要在 Student 中显式定义一个 create 方法,或者这是给定的东西? (这个项目是用脚手架做的)

谢谢。

编辑 1:我使用了 Damien 的建议并调用了 create! 而不是 create,但得到了相同的响应。然后我所做的就是看看代码是否达到了那么远,就是这样,

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

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

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

【问题讨论】:

    标签: ruby-on-rails migration


    【解决方案1】:

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

    无法包含您的数据的一个原因是您的验证未通过。
    通过使用create! 而不是create,您可以轻松查看导致数据不包含在内的错误。
    所以如果模型无法创建,就会抛出异常,迁移失败。

    【讨论】:

    • 我按照您的建议做了,但得到了相同的结果...然后我将 create 方法更改为废话(请参阅原始帖子的更新),并且 migrate 继续正常工作。
    【解决方案2】:

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

    你的 rails 版本是多少年了?

    【讨论】:

      【解决方案3】:

      如果架构编号在数据库中,迁移将不会运行。

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

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

      【讨论】:

        猜你喜欢
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        • 2013-06-26
        • 2017-02-05
        • 2017-01-07
        • 1970-01-01
        • 2012-01-25
        • 1970-01-01
        相关资源
        最近更新 更多