启动了一个新的rails 3应用程序。我已经通过Scaffold生成了一些迁移。当我运行“rake db:migrate”时,即使我运行“rake --verbose db:migrate”,也没有输出到控制台
这是一个示例迁移
class CreateBicycles < ActiveRecord::Migration
def self.up
create_table :bicycles do |t|
t.string :title
t.text :Note
t.string :Manufacturer
t.string :Model
t.date :year_manufactured
t.integer :view_count
t.timestamps
end
end
def self.down
drop_table :bicycles
end
end
答案 0 :(得分:1)
我遇到了像你这样的问题。这是我的问题描述。
尝试rake db:version,它返回0.
尝试rake db:migrate,没有任何事情发生,也没有创建表,即使db / migrate中有迁移文件也是如此。 尝试rake db:migrate VERSION = YourAnyMigrationFileTimestamp ,引发异常,不会引起此类迁移。
如果您的问题与我一样,可能是您在运行迁移任务时获得或安装了错误的rake任务,该任务更改了默认root。
要检查它,你需要调试第三个任务,(http://stackoverflow.com/questions/2663912/rails-debugging-rails-tasks可以告诉你如何调试rake任务)。
在activerecord-3.0.1 / lib / active_record / migration.rb中调试第548行,运行Dir.pwd,如果 结果不是您的应用根,必须有一些其他任务更改您的默认任务目录。
以下是我调试的内容
(rdb:1)p self.class
的ActiveRecord ::迁移
(rdb:1)n
/home/raykin/.rvm/gems/ruby-1.9.2-p0@r3local/gems/activerecord- 3.0.1 / LIB / active_record / migration.rb:550
files = Dir [“#{@ migrations_path} / [0-9] _ .rb”]
(rdb:1)n
/home/raykin/.rvm/gems/ruby-1.9.2-p0@r3local/gems/activerecord- 3.0.1 / LIB / active_record / migration.rb:552
migrations = files.inject([])do | klasses,file |
(rdb:1)p个文件
[]
(rdb:1)p @migrations_path
“分贝/迁移/”
(rdb:1)p Dir ['db / migrate / [0-9] _ .rb']
[]
(rdb:1)l
*输出已刷新*
(rdb:1)Dir.pwd
* 未知命令:“Dir.pwd”。试试“帮助”。
(rdb:1)p Dir.pwd
“/家/ raykin /校园/:/代码/校园/分贝/ data_export”
看,当前dir已经更改,导致rails在运行之前加载所有任务 迁移(似乎有一种跳过所有负载的方法),以及一些不好的任务(我昨天写的......)改变了当前的目录。
这不是Rails的问题,但对用户来说确实是一个混乱的结果。 希望可以帮到你。
答案 1 :(得分:1)
我有一个绝对奇怪的答案,我已经证实是真的。我们用VERSION=<our application version>
构建了docker容器,发现我们的迁移都没有在容器内部运行,但在容器外运行正常。
长话短说:确认您没有指定任何名为VERSION
的环境变量,否则迁移会将其用作target_version
,如果它不是nil
,则赢了不要运行所有迁移。
来自lib/activerecord/tasks/database_tasks.rb
的相关代码:
def migrate
raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
version = ENV["VERSION"] ? ENV["VERSION"].to_i : nil
scope = ENV["SCOPE"]
verbose_was, Migration.verbose = Migration.verbose, verbose
Migrator.migrate(migrations_paths, version) do |migration|
scope.blank? || scope == migration.scope
end
ActiveRecord::Base.clear_cache!
ensure
Migration.verbose = verbose_was
end