我正在研究Belongs_to协会,我使用了以下模型,因为每个订单都属于客户,所以我使用了belongs_to,以便在创建订单时给出错误
未定义的方法`命令'对于#
当我在客户模型中使用has_many:orders时,它运行正常,为什么呢 不适用于belongs_to
与has_many合作:客户模型中的订单,但没有 has_one:客户控制器中的订单,它给出了相同的错误。
提前感谢。
型号: - order.rb
class Order < ActiveRecord::Base
belongs_to :customer
attr_accessible :order_date, :customer_id
end
型号: - customer.rb
class Customer < ActiveRecord::Base
attr_accessible :name
end
控制器: - orders.rb
def create
@customer = Customer.find_by_name(params[:name])
@order = @customer.orders.new(:order_date => params[:orderdate] )
respond_to do |format|
if @order.save
format.html { redirect_to @order, notice: 'Order was successfully created.' }
format.json { render json: @order, status: :created, location: @order }
else
format.html { render action: "new" }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
end
end
答案 0 :(得分:11)
从技术上讲,belongs_to
将无法匹配has_many
或has_one
。例如,如果您说订单belongs_to :customer
,则可以在Order对象上调用.customer
,并获取Customer对象。
你不能做的就是给客户打电话.orders
而不告诉客户has_many :orders
(或.order
,has_one
),因为该方法已创建通过has_many
声明。
那就是说,我想不出你想要只指定一半关系的任何理由。这是一个糟糕的设计选择,你不应该这样做。
修改:has_one
不会创建.collection
所做的has_many
方法。每the guide:
4.2.1 has_one
添加的方法声明has_one关联时,声明类 自动获得与关联相关的四种方法:
association(force_reload = false) association=(associate) build_association(attributes = {}) create_association(attributes = {})
您会注意到该列表中没有.new
。如果要添加关联对象,可以使用customer.build_order()
或customer.order = Order.new()
。