1

したがって、次のテストでモデルの関連付けをテストしようとしています。

it 'retrieve items registered under person' do
  p = FactoryGirl.create(:person)
  o = FactoryGirl.create(:order, customer: p)
  o.customer.should == p
  i = FactoryGirl.create(:item)
  o.items << i
  o.save
  p.items.count.should == 1
end

私のモデル:

class Person < AR:Base
  has_many :orders, :as => :customer
  has_many :items, :through => :orders
end

class Order < AR:Base
  has_many :items
  belongs_to :customer, :class_name => Person
end

class Item < AR:Base
  belongs_to :order
  has_one :customer, :class_name => Person, :through => :order
end

しかし、テストを実行すると、次のエラーが表示されます。

SQLite3::SQLException: no such column: orders.customer_type: SELECT COUNT(*) FROM "items" INNER JOIN "orders" ON "items"."order_id" = "orders"."id" WHERE "orders"."customer_id" = 1 AND "orders"."customer_type" = 'Person'

私は何を間違っていますか?

更新: 問題は ':as => :customer' ビットにありました。しかし、私の本当の問題はテストにありました。アイテムの作成で順序を割り当てる必要がありました。

4

2 に答える 2

1

これは、:asオプションがポリモーフィック インターフェイスを指定しているためです。これは "orders"."customer_type" = 'Person'where 句で説明します。私はあなたがすることを意味すると思います:

class Person < ActiveRecord::Base
  has_many :orders, :foreign_key => :customer_id
  has_many :items, :through => :orders
end

ガイド:asのオプションを参照してください。

于 2013-05-31T04:06:35.947 に答える
0

アイテムはオーダーを通じて顧客に属するべきだと思います

class Item < AR:Base
  belongs_to :order
  belongs_to :customer, :class_name => Person, :through => :order
end
于 2013-05-31T03:47:11.377 に答える