我正在关注这本书:“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
这是我做的:
rails g migration add-addresses
在生成的迁移文件
rake db:migrate
发生这种情况:
== 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) ============================
rails c
State.last
导致此问题:
NameError: uninitialized constant State
我查了一下,'状态'是否在附近:
ActiveRecord::Base.connection.tables.map do |model|
model.capitalize.singularize.camelize
end
导致:
["SchemaMigration", "ArInternalMetadatum", "User", "Customer", "State", "Address", "CustomersBillingAddress", "CustomersShippingAddress"]
由于“国家”显然存在,我对此问题无能为力。有什么建议吗?
PS:我已经尝试过了,但问题仍然存在:rake db:drop:all
rake db:create:all
rake db:migrate
答案 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
看看是否有效。稍后您可以添加关联。这将初始化类。