8

我正在研究 Belongs_to 关联,我使用了以下模型,因为每个订单都属于客户,所以我在订单模型中使用了 belongs_to,它在创建订单时会出错

未定义的方法“订单”#

  1. 当我在客户模型中使用 has_many :orders 时,它工作正常,为什么它不适用于 only belongs_to

  2. 它与客户模型中的 has_many :orders 一起使用,但不适用于客户控制器中的 has_one : order ,它给出了相同的上述错误。

提前致谢。

型号:- 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
4

1 回答 1

16

从技术上讲,无需匹配belongs_to . 例如,如果您说 Order ,您可以调用Order 对象,并获取 Customer 对象。您不能做的是在不告诉它的情况下调用 Customer (或者,在 的情况下),因为该方法是由声明创建的。has_manyhas_onebelongs_to :customer.customer.ordershas_many :orders.orderhas_onehas_many

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

编辑:has_one不创建.collection这样做的方法has_many。根据指南

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()

于 2013-09-23T01:34:04.793 回答