20

我一直在使用 sqlite(Rails 开发环境的默认设置)为事件(黑客马拉松)开发 Rails 4.0 应用程序,该应用程序具有父模型 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 中,但这些没有。知道发生了什么吗?

4

2 回答 2

20

我认为您的上次迁移是错误的。我会把它改成这样:

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

不幸的是,您的数据库可能处于不稳定状态,因为它具有无效的列类型(即没有“引用”列类型,但 sqlite 还是做到了)。希望它只是一个开发数据库,​​因此您可以删除它并重新开始。

于 2013-07-28T04:16:52.947 回答
0

以防万一这有助于某人。我在 sqlite dev db 上执行此操作,如上所述,在我所有的实验迁移中,它可能处于不稳定状态。通过删除 sqlite 文件,重新创建并运行所有迁移,现在一切正常。

于 2017-11-15T19:00:50.500 回答