【问题标题】:Error running a Ruby on Rails database migration运行 Ruby on Rails 数据库迁移时出错
【发布时间】:2017-07-24 07:46:50
【问题描述】:

我正在 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 命令在哪里。它最初是用脚手架命令制作的,它在我的系统中放置了一大堆额外和无用的东西。

我的 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

这是基本的,但我在数据库中的用户表有这些列:

+------------------+------------------+------+-----+---------+-------+
| 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 命令后这种不一致是如何存在的。如果不是我发布的上述文件,它从哪里获取指令?

谢谢!

【问题讨论】:

  • 您可以粘贴未迁移的迁移文件(或多个文件)的内容吗?
  • @twmills 实际上,这是问题的一部分——我不完全确定如何获取这些文件,哈哈……它们通常位于哪里?
  • 您在此之前是否进行过迁移?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我建议您使用 --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 行的错误。

    【讨论】:

    • @feelnoway 我真正不明白的是为什么我的 db/migrate 目录中只有 4 个文件,而我的 MySQL db 中有 20 个表。我使用了一次脚手架命令,但真的想知道是什么将这些额外的表放在那里。关于为什么会发生这种情况的任何想法?
    • @feelnoway 我编辑了我的问题以显示迁移脚本和创建的数据库表。
    • 在不了解环境历史的情况下,很难说出这些表是什么以及它们来自何处。您是否考虑过清理数据库然后再次运行迁移?您可能想尝试使用rake db:migrate:reset 命令,但请记住,这会清除当前存储在数据库中的数据,因此请先确定。如果这不起作用,我会考虑手动删除数据库中的所有表或简单地重新创建数据库。
    • @feelnoway 是的,我想清理数据库。我只是在等待在红宝石世界中学习正确的方法。我习惯于存储单独的文件来重新创建表。重置命令是清除旧表并创建新表吗?
    • 确实您的用户表与您的用户迁移不一致。我怀疑用户表过去可能已用于另一个项目。我建议您只需重新创建数据库或清除所有表,然后再次运行迁移。此外,如果您已经有一个用户模型并正在尝试集成设计,那么我建议您查看此post,它将告诉您如何更新您的用户迁移以使其与设计一起工作。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我的问题是我使用了:

      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

      愚蠢的错误,我知道。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 2015-01-11
        • 2017-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多