1

我对宠物和兽医有一组非常简单的数据要求。

  • 一个owner可以有很多pets
  • 一个pet可以有一个owner
  • Apet可以被 (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不是传统意义上的联接表,因为我不想每次创建所有者和兽医之间的关系时都创建一个全新的宠物。我应该使用更像Ownerhas_many Pets、Petbelongs_to :owner 和Pethas_and_belongs_to_many Veterinarians 的模式吗?

谢谢!

4

1 回答 1

1

Pet您必须在和之间使用连接表Veterinarian。让我们称之为Treatment

class Treatment < ...
...
  belongs_to :pet
  belongs_to :veterinarian
...
end

class Veterinarian < ...
...
  has_many :treatments
  has_many :pets, through: :treatments
...
end

class Pet < ...
...
  has_many :treatments
  has_many :veterinarians, through: :treatments
...
end
于 2012-04-10T18:18:45.270 回答