Ошибка запуска миграции базы данных Ruby on Rails - PullRequest
2 голосов
/ 13 мая 2011

Я устанавливаю гем разработки для аутентификации в приложении Ruby on Rails и запускаю миграцию базы данных следующим образом:

rake db:migrate

и получил эту ошибку:

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

Это немного загадочно. Куда мне обратиться, чтобы отладить это и в чем может быть проблема?

Единственная нестандартная вещь, которую я сделал, это присвоила ей имя таблицы «users», то есть имя моей таблицы в предыдущей команде: rails генерирует devise users

Кроме того, в моем файле rout.rb есть новая запись:

devise_for :users

Вероятно, проблема заключается в несовпадении столбцов в моей базе данных и в том, что пакет auth считает таблицей пользователей. Где я могу посмотреть, что пакет auth считает столбцами? И где я могу найти, где находится команда create-table для таблицы пользователей, которая у меня есть. Первоначально это было сделано с помощью команды 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

Что является основным, но моя таблица пользователей в БД имеет следующие столбцы:

+------------------+------------------+------+-----+---------+-------+
| 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 ]

10 голосов
/ 20 ноября 2011

У меня была похожая ошибка после создания новой модели:

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

Проблема заключалась в том, что я использовал «ссылку» вместо «ссылки» при создании модели.Эта команда создает следующую миграцию:

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 голос
/ 13 мая 2011

Я предлагаю вам запустить команду db: migrate с параметром --trace:

rake db:migrate --trace

В качестве примера я специально добавил синтаксическую ошибку в мою миграцию devise, и это фрагмент выводаЯ получил.Как видите, опция --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.

0 голосов
/ 24 июля 2017

Моя проблема была в том, что я использовал:

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

Глупая ошибка, я знаю.

0 голосов
/ 21 марта 2016

Проверьте файл миграции "migrate / 20101031153010_devise_create_users.rb". Возможно, вы допустили ошибку или опечатку в коде.

...