Rails,rake db:migrate之后的未初始化的常量

时间:2016-12-11 18:02:32

标签: ruby-on-rails

我正在关注这本书:“Rails,Angular,Postgres和Bootstrap”。在某些时候,作者用这段代码编写了一个新的迁移:

class AddAddresses < ActiveRecord::Migration
  def change
    create_table :states do |t|
      t.string :code, size: 2, null: false
      t.string :name,          null: false
    end

    create_table :addresses do |t|
      t.string     :street,                    null: false
      t.string     :city,                      null: false
      t.references :state,                     null: false
      t.string     :zipcode,                   null: false
    end

    create_table :customers_billing_addresses do |t|
      t.references :customer, null: false
      t.references :address,  null: false
    end

    create_table :customers_shipping_addresses do |t|
      t.references :customer, null: false
      t.references :address,  null: false
      t.boolean :primary, null: false, default: false
    end
  end
end

这是我做的:

  1. rails g migration add-addresses

  2. 在生成的迁移文件

  3. 中复制并粘贴上面的代码
  4. rake db:migrate

  5. 发生这种情况:

    == 20161211174928 AddAddresses: migrating =====================================
    -- create_table(:states)
       -> 0.0140s
    -- create_table(:addresses)
       -> 0.0129s
    -- create_table(:customers_billing_addresses)
       -> 0.0115s
    -- create_table(:customers_shipping_addresses)
       -> 0.0142s
    == 20161211174928 AddAddresses: migrated (0.0529s) ============================
    
    1. rails c
    2. State.last导致此问题:

      NameError: uninitialized constant State

    3. 我查了一下,'状态'是否在附近:

      ActiveRecord::Base.connection.tables.map do |model|  
        model.capitalize.singularize.camelize
      end
      
    4. 导致:

      ["SchemaMigration", "ArInternalMetadatum", "User", "Customer", "State", "Address", "CustomersBillingAddress", "CustomersShippingAddress"]
      

      由于“国家”显然存在,我对此问题无能为力。有什么建议吗?

      PS:我已经尝试过了,但问题仍然存在:

      rake db:drop:all
      rake db:create:all
      rake db:migrate
      

2 个答案:

答案 0 :(得分:2)

state.rb目录下是否有app/models个文件?我猜你没有。创建表格不会生成model(类),而使用rails g model生成模型会为您创建迁移。

state.rb中创建名为app/models的文件,并将以下内容添加到文件中。

class State < ActiveRecord::Base
end

答案 1 :(得分:0)

由于您指示State.code和State.name不能为空,并且表中很可能没有任何数据,所以首先创建一些数据,即:

state=State.create(code: 12, name: "New Jersey")

试试吧 在models目录中创建一个名为state.rb的文件。在其中:

classState < ActiveRecord::Base
end

看看是否有效。稍后您可以添加关联。这将初始化类。