2013-09-21 26 views
4

我学习belongs_to的关联,我已经使用以下机型,在每一个订单属于客户的,所以我用belongs_to的,以模型,可以给错误而创造秩序可以belongs_to的工作没有的has_many或HAS_ONE

未定义的方法'订单为#

  1. 当我使用的has_many

    :订单的客户模型,可以正常工作,为什么它 不只是belongs_to的

  2. 工作
  3. 它与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 

回答

10

技术上,belongs_to工作没有匹配的has_manyhas_one。例如,如果您说订单belongs_to :customer,您可以在Order对象上调用.customer,并获取Customer对象。 你不能做的就是呼叫.orders而不告诉它它has_many :orders(或.order,在has_one的情况下),因为该方法是由has_many声明创建的。

这就是说,我想不出任何你只想指定一半关系的原因。这是一个糟糕的设计选择,你不应该这样做。

编辑:has_one不会创建has_many所做的.collection方法。每the guide:由HAS_ONE

加在声明HAS_ONE协会

4.2.1方法,声明类 自动获得相关协会四种方法:

association(force_reload = false) 
association=(associate) 
build_association(attributes = {}) 
create_association(attributes = {}) 

你会注意到该列表上没有.new。如果要添加关联的对象,可以使用customer.build_order()customer.order = Order.new()

+0

好的谢谢。它的工作正确的Belongs_to has_many,但在belongs_to has_one的情况下,它会给出错误: - 未定义的方法'新'.. @order = @ customer.order.new(:order_date => params [:orderdate]); @ order.save; –