2013-09-21 62 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; –