经历了轨道/Email2.1.1

  • 你创建的第一版本(例如)红宝石脚本\产生的支架产品标题:string说明:文image_url:string
  • 这创造(例如)迁移文件中称为20080910122415_create_products.rb
  • 你申请的移民与瑞克db:迁移
  • 现在,可以添加一领域的产品表与红宝石脚本\产生移徙add_price_to_product价:小数
  • 此创建一个迁移文件中称为20080910125745_add_price_to_product.rb
  • 如果你尝试运行耙db:迁移,它实际上将恢复第一次迁移,而不适用于下一个!所以你的产品表将得到摧毁了!
  • 但是如果你跑了,瑞克独自一人,它就会告诉你的那一个迁移尚待

请注意,应用耙db:迁移(一旦表已被摧毁)将适用于所有移徙的秩序。

唯一的解决方法,我发现是指定的版本的新移民:

rake db:migrate version=20080910125745

所以我想知道:这是一个预期新的行为?

有帮助吗?

解决方案

你应该能够使用

rake db:migrate:up 

强迫它向前走,但随后你的风险缺少交织的迁移,从其他人对你的团队

如果你跑

rake db:migrate 

两次,它将重新应用你所有的迁移。

我遇到同样的行为在窗源码,它可能是一个错误的具体要这样一个环境。

编辑 -我发现为什么。在railstie数据库。瑞克的任务有下列代码:

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false."
task :migrate => :environment do
  ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
  ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
  Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
end

然后在我的环境变量的我有

echo %Version% #=> V3.5.0f

在红宝石

ENV["VERSION"] # => V3.5.0f
ENV["VERSION"].to_i #=>0 not nil !

因此瑞克的任务的电话

ActiveRecord::Migrator.migrate("db/migrate/", 0)

在Email::迁移,我们有:

class Migrator#:nodoc:
  class << self
    def migrate(migrations_path, target_version = nil)
      case
        when target_version.nil?              then up(migrations_path, target_version)
        when current_version > target_version then down(migrations_path, target_version)
        else                                       up(migrations_path, target_version)
      end
    end

是的, rake db:migrate VERSION=0 是的长版本 rake db:migrate:down

编辑 -我会去更新的灯塔的错误但我的超级公司代理禁止,我连接有

在此期间,你可以尝试取消版本你打电话之前迁移...

其他提示

我恭敬地不同意汤姆!此 一个错误!!V3。5.0f不是一个有效的版本耙迁移。瑞克不应该使用它的迁移:下,只是因为红宝石的选择要考虑"V3。5.0f"。to_i是0...

瑞克应该大声地抱怨说,版本不是有效的,以便用户知道是什么了 (你和我之间,检查,该版本是一个YYYYMMDD格式化的时间戳通过转换为整是有点轻)

[该死的IE6,不会允许我的评论!没有我不能改变的浏览器感谢企业]

这不是预期的行为。我要建议报告这一错误在灯塔,但是我看到你 已经这样做了!如果你提供一些更多的信息(包括操作系统/数据库/红宝石的版本),我将看看它。

Jean,

谢谢你的调查。你是对的,实际上我认为你已经发现了一个更严重的错误,对物种的设计错误'.

发生什么事了,瑞克将抓住任何值通过的命令行和储存它们作为环境变量。瑞克的任务,最终将得到所谓的将只是把这种价值来自环境变量。当db:迁移查询ENV["版本"],它实际上要求的版本参数设置呼叫瑞克.当你呼叫瑞克db:迁移,你不通过任何版本。

但是我们有一个环境变量所谓的版本已经设置了用于其他目的的其他一些程序(我不是哪一个)。和这些家伙背后rake(或后面的数据库。瑞克)还没有想到会发生这种情况。那是设计错误。至少,他们可能使用的更具体的变量名称,如"RAKE_VERSION"或"RAKE_PARAM_VERSION"而不是"版本"。

汤姆,我一定会不关闭,但是编辑我的错误报告的灯塔,以反映这些新的调查结果。

并再次感谢让你的帮助。我已经发布这个问题上的灯塔等5天agao,仍然没有得到答案!

罗洛

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top