我对宠物和兽医有一组非常简单的数据要求。
- 一个
owner
可以有很多pets
- 一个
pet
可以有一个owner
- A
pet
可以被 (belongs_to) many 对待veterinarians
- 一个
veterinarian
可以治疗(have_many)pets
Owner
并且Veterinarian
都是User
使用 STI 的子类。
这是一些代码:
class Owner < User
has_many :pets
has_many :veterinarians, :through => :pets
end
class Veterinarian < User
attr_accessible :clinic_name
has_many :pets
has_many :owners, :through => :pets
end
class Pet < ActiveRecord::Base
attr_accessible :name, :date_of_birth, :species, :breed, :gender, :neutered
belongs_to :owner
belongs_to :veterinarian
end
这是失败的规范:
it "has various veterinarians" do
o = Owner.make!(:email => 'owner1@gmail.com')
v1 = Veterinarian.make!(:email => 'vet_1@gmail.com')
v2 = Veterinarian.make!(:email => 'vet_2@gmail.com')
p = Pet.make!(:name => 'fluffy')
o.pets << p
v1.pets << p
v2.pets << p
o.pets.should have(2).records
o.veterinarians.should have(2).records
end
这make!
与使用机械师夹具更换有关。它只是工厂创建对象。
失败发生在最后一行。原来 o.veterinarians 只有 1 条记录。我知道 apet
不是传统意义上的联接表,因为我不想每次创建所有者和兽医之间的关系时都创建一个全新的宠物。我应该使用更像Owner
has_many Pet
s、Pet
belongs_to :owner 和Pet
has_and_belongs_to_many Veterinarian
s 的模式吗?
谢谢!