与rails的简单关联问题,而不是工作

时间:2015-09-18 10:24:28

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

这是我的架构文件

ActiveRecord::Schema.define(version: 20150917104809) do
    create_table "customers", force: :cascade do |t|
         t.datetime "created_at", null: false
         t.datetime "updated_at", null: false
         t.string   "name"
    end
    create_table "orders", force: :cascade do |t|
        t.datetime "created_at",   null: false
        t.datetime "updated_at",   null: false
        t.datetime "order_date"
        t.integer  "customers_id"
    end
end

以下是模型

class Customer < ActiveRecord::Base
  has_many :orders, dependent: :destroy
end

class Order < ActiveRecord::Base
  belongs_to :customer
end

关联的迁移文件是

class AddForeignKeyToOrders < ActiveRecord::Migration
  def change
    add_reference :orders, :customers
  end
end

遵循link

中的简单rails assoc示例

我使用命令

创建了客户记录
Customer.create(name: 'Someone')

现在尝试创建订单

@order = @customer.orders.create(order_date: Time.now)

使用NilClass

收到错误
NoMethodError: undefined method `orders' for nil:NilClass

可能是另一双帮助告诉我我做错了什么的眼睛。

2 个答案:

答案 0 :(得分:3)

您需要将create的返回值指定为@customer

@customer = Customer.create(name: 'Someone')
@order = @customer.orders.create(order_date: Time.now)

看起来您的架构中也有拼写错误。它应该是:

t.integer  "customer_id"

编辑:您的迁移文件不正确。它应该是:

class AddForeignKeyToOrders < ActiveRecord::Migration
  def change
    add_reference :orders, :customer
  end
end

请参阅add_reference API docs

答案 1 :(得分:1)

要添加到@ghr的答案,您的错误就是:for nil:NilClass

这意味着您尝试在不存在的对象上调用方法。 Ruby实际上将nil类分配给NilClass对象,因此除非您花时间与它们一起使用,否则它的错误不容易被识别。

-

您必须将Customer.create...分配给variable,否则Rails不会存储您要使用的数据:

@customer = Customer.create(name: "Someone")
@customer.orders.create

作为备注,您order_date模型中不需要Order - created_at会处理此问题。如果您从表格中删除了order_date列,则可以调用以下内容:

#app/models/order.rb
class Order < ActiveRecord::Base
   belongs_to :customer
   alias_attribute :date, :created_at
end

@customer.orders.first.date