多对多关系:通过给出'找不到关联'错误

时间:2013-05-17 02:14:22

标签: ruby activerecord has-many-through

在我的模型中,ItemUser创建,可由许多Users购买,User可以购买许多Items。< / p> 使用User 定义了

ItemPurchaseAcvtiveRecord,其中包含为了简洁而删除了多余的详细信息,如下所示:

class User < ActiveRecord::Base
  # various other fields
  has_many :items, :foreign_key => :creator_id
  has_many :purchased_items, :through => :purchases, :source => :item
end

class Item < ActiveRecord::Base
  # various other fields
  belongs_to :creator, :class_name => 'User'
  has_many :buyers, :through => :purchases, :source => :user
 end

 class Purchase < ActiveRecord::Base
   belongs_to :item
   belongs_to :user
  # various other fields
 end

并且rspec测试也按照以下方式剪切了

describe "user purchasing" do
  it "should allow a user to purchase an item" do
    a_purchase = Purchase.create!(:item => @item, # set up in `before :each`
                                  :user => @user  # set up in `before :each`
    )
    a_purchase.should_not eq(nil)                 # passes
    @item.buyers.should include @user             # fails
    @user.purchased_items.should include @item    # fails
  end
end

这导致

1) Purchase user purchasing should allow a user to purchase an item
   Failure/Error: @item.buyers.should include @user
   ActiveRecord::HasManyThroughAssociationNotFoundError:
     Could not find the association :purchases in model Item

同样,如果我调换@file_item.buyers.should include @user@user.purchased_items.should include @item,我会得到相同的

1) Purchase user purchasing should allow a user to purchase an item
   Failure/Error: @user.purchased_items.should include @item
   ActiveRecord::HasManyThroughAssociationNotFoundError:
     Could not find the association :purchases in model User

我的migration看起来像

create_table :users do |t|
  # various fields
end

create_table :items do |t|
  t.integer :creator_id   # file belongs_to creator, user has_many items
  # various fields
end

create_table :purchases do |t|
  t.integer :user_id
  t.integer :item_id
  # various fields
end

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您必须指定以下内容。

class User < ActiveRecord::Base
  has_many :purchases
  has_many :items, :foreign_key => :creator_id
  has_many :purchased_items, :through => :purchases, :source => :item
end

class Item < ActiveRecord::Base
  # various other fields
  has_many :purchases
  belongs_to :creator, :class_name => 'User'
  has_many :buyers, :through => :purchases, :source => :user
end

仅在指定

      has_many :purchases

模型将能够识别关联。