1

在我的模型中,anItem是由 a 创建的User,可以被很多人购买Users,而 aUser可以购买很多人Items

User, Item, 和Purchase是定义的,AcvtiveRecord 为了简洁起见,使用了多余的细节,如下所示:

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

我做错了什么?

4

1 回答 1

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

该模型将能够识别关联。

于 2013-05-17T02:56:13.493 回答