运行Ruby on Rails数据库迁移时出错

时间:2011-05-13 17:45:29

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

我在Ruby on Rails应用程序中安装了用于身份验证的devise gem,我运行了这样的数据库迁移:

rake db:migrate

并收到此错误:

undefined method `reference' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x9322248>

这有点神秘。我应该去哪里调试这个,问题是什么?

我做的唯一非标准事情是给它表名“users”,这是我在上一个命令中的表名:rails generate devise users

另外,我的routes.rb文件有这个新条目:

devise_for :users

问题可能是我的数据库中的列不匹配,以及auth包认为用户表应该是什么样的。我在哪里看看auth包认为列是什么样的?我在哪里可以找到create-table命令对于我所拥有的users表的位置。它最初是用scaffold命令制作的,它在我的系统中放了一大堆额外的和无用的东西。

我的db / migrate / users / create_users文件如下所示:

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

哪个是基本的,但我的db中的users表有以下列:

+------------------+------------------+------+-----+---------+-------+
| Field            | Type             | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| uid              | int(10) unsigned | NO   | PRI | 0       |       |
| name             | varchar(60)      | NO   | UNI |         |       |
| pass             | varchar(128)     | NO   |     |         |       |
| mail             | varchar(254)     | YES  | MUL |         |       |
| theme            | varchar(255)     | NO   |     |         |       |
| signature        | varchar(255)     | NO   |     |         |       |
| signature_format | varchar(255)     | YES  |     | NULL    |       |
| created          | int(11)          | NO   | MUL | 0       |       |
| access           | int(11)          | NO   | MUL | 0       |       |
| login            | int(11)          | NO   |     | 0       |       |
| status           | tinyint(4)       | NO   |     | 0       |       |
| timezone         | varchar(32)      | YES  |     | NULL    |       |
| language         | varchar(12)      | NO   |     |         |       |
| picture          | int(11)          | NO   |     | 0       |       |
| init             | varchar(254)     | YES  |     |         |       |
| data             | longblob         | YES  |     | NULL    |       |
+------------------+------------------+------+-----+---------+-------+

我不确定运行migrate命令后是否存在这种不一致的情况。如果不是我发布的上述文件,它会从哪里获取指示?

谢谢!

4 个答案:

答案 0 :(得分:10)

生成新模型后出现类似错误:

rails generate model Status open:boolean available:integer station:reference

问题是我在生成模型时使用'reference'而不是'references'。此命令将创建以下迁移:

class CreateStatuses < ActiveRecord::Migration
    def change
        create_table :statuses do |t|
            t.boolean :open
            t.integer :available
            t.reference :station
        end
    end
end

方法'reference'未定义,因此错误。在我的情况下迁移应该是:

class CreateStatuses < ActiveRecord::Migration
    def change
        create_table :statuses do |t|
            t.boolean :open
            t.integer :available
            t.references :station
        end
    end
end

答案 1 :(得分:1)

我建议您使用--trace选项运行db:migrate命令:

rake db:migrate --trace

作为一个例子,我故意在我的设计迁移中添加了一个语法错误,这是我得到的输出的一个片段。如您所见, - trace选项应指向您确切的错误(迁移文件+行#)。

    undefined method `strin' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x00000106c5ea98>
    /Users/#####/.rvm/gems/ruby-1.9.2-p136@rails3/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract/schema_definitions.rb:326:in `method_missing'
    /Users/#####/rails/$$$$$$/db/migrate/20101031153010_devise_create_users.rb:13:in `block in up'
    /Users/#####/.rvm/gems/ruby-1.9.2-p136@rails3/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract/schema_statements.rb:157:in `create_table'
...

请注意,您的迁移文件位于db/migrate目录下。因此,鉴于上述错误,我需要打开db / migrate / 20101031153010_devise_create_users.rb迁移文件并修复第13行的错误。

答案 2 :(得分:0)

检查您的迁移文件“migrate / 20101031153010_devise_create_users.rb”。 您可能在代码中犯了错误或拼写错误。

答案 3 :(得分:0)

我的问题是我用过:

za$ rails g scaffold team name:string team_id:integer:uniq  references:vendor

而不是:

za$ rails g scaffold team name:string team_id:integer:uniq  vendor:references

刚刚更改了vendor:references to vendor:references

愚蠢的错误,我知道。