我有一个客户,物品和订单模型。客户has_many物品通过订单和has_many订单。物品has_many客户通过订单和has_many订单。订单属于客户和项目。尝试通过控制台保存时出现ActiveRecord::UnknownAttributeError: unknown attribute 'customer_id' for Order.
错误:
客户型号:
class Customer < ActiveRecord::Base
has_many :orders
has_many :items, through: :orders
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
项目型号:
class Item < ActiveRecord::Base
has_many :orders
has_many :customers, through: :orders
end
订单型号:
class Order < ActiveRecord::Base
belongs_to :item
belongs_to :customer
end
订单表:
class CreateOrders < ActiveRecord::Migration
def change
create_table :orders, id: false do |t|
t.belongs_to :customers, index: true
t.belongs_to :items, index: true
t.timestamps null: false
end
end
end
保存订单的控制台命令 (请注意,cuban_sandwich和chris已保存为新的Customer和Item。)
order1 = chris.orders.build(customers_id: chris.id, items_id: cuban_sandwich.id)
我可以错误地保存吗?或者我的模型/表关联有问题吗?
答案 0 :(得分:2)
首先确保customer_id
表
orders
列
rails g migration AddCustomerIdToOrders customer_id:integer
rake db:migrate
此外,我不认为您需要放置customers_id
,因为它将在关联时填写。您还需要使用create
而不是build
而不是
order1 = chris.orders.build(customers_id: chris.id, items_id: cuban_sandwich.id)
试试这个
order1 = chris.orders.create(items_id: cuban_sandwich.id)
答案 1 :(得分:2)
您的问题是由于您的迁移造成的。这些行:
t.belongs_to :customers, index: true
t.belongs_to :items, index: true
创建名为customers_id
和items_id
的字段,而非customer_id
和items_id
(注意单数与复数)。
属于关联是一对一关系,所以它应该是单数,customer_id
。
使用rake db:rollback
回滚您的迁移,并将两个belongs_to
来电更改为customer
和item
。