Rails 4: schema.db показывает "Не удалось вывести таблицу" события "из-за использования метода NoMethodError # undefined` [] 'для nil: NilClass"

Я работал над приложением Rails 4.0 с sqlite (по умолчанию для среды разработки Rails) для событий (hackathons), у которых есть родительская модель Event, для которой может быть много Press_Blurbs.

Сначала я запустил несколько генераторов лесов, которые создали некоторые миграции, которые я запускал, казалось бы, без проблем:

class CreateEvents < ActiveRecord::Migration
  def change
    create_table :events do |t|
      t.string :city
      t.string :theme
      t.datetime :hackathon_start
      t.datetime :hackathon_end
      t.datetime :show_start
      t.datetime :show_end
      t.text :about
      t.string :hack_rsvp_url
      t.string :show_rsvp_url

      t.timestamps
    end
  end
end

class CreatePressBlurbs < ActiveRecord::Migration
  def change
    create_table :press_blurbs do |t|
      t.string :headline
      t.string :source_name
      t.string :source_url
      t.string :logo_uri

      t.timestamps
    end
  end
end

Затем я добавил некоторые отношения к моделям:

class Event < ActiveRecord::Base
  has_many :press_blurbs
end

class PressBlurb < ActiveRecord::Base
  belongs_to :event
end

... и добавил/выполнил миграцию, чтобы добавить ссылку на таблицу:

class AddEventRefToPressBlurbs < ActiveRecord::Migration
  def change
    add_column :press_blurbs, :event, :reference
  end
end

Тем не менее, когда я смотрю на schema.db, это то, что я вижу вместо определения таблиц:

# Could not dump table "events" because of following NoMethodError
#   undefined method `[]' for nil:NilClass

# Could not dump table "press_blurbs" because of following NoMethodError
#   undefined method `[]' for nil:NilClass

Другие несвязанные таблицы отображаются в schema.rb отлично, но это не так. Любая идея, что происходит?

Ответы

Ответ 1

Я думаю, что ваша последняя миграция неверна. Я бы изменил его на это:

class AddEventRefToPressBlurbs < ActiveRecord::Migration
  def change
    add_reference :press_blurb, :event
  end
end

К сожалению, ваша база данных, скорее всего, находится в состоянии wonky, потому что она имеет недопустимый тип столбца (т.е. тип столбца "ссылочный" отсутствует, но sqlite сделал это в любом случае). Надеюсь, это просто база данных разработки, поэтому вы можете просто удалить ее и начать новую работу.

Ответ 2

На всякий случай это помогает кому-то. Я делал это на sqlite dev db, и, как упоминалось выше, это было, вероятно, в состоянии покоя из всех моих экспериментальных миграций. Удалив файл sqlite, воссоздавая и запуская все миграции, теперь это прекрасно.