1

私はペットや獣医に関係する非常に単純なデータ要件のセットを持っています。

  • owner多くのことができますpets
  • Apetは1つを持つことができますowner
  • Apetは(belongs_to)多くの人が扱うことができますveterinarians
  • 扱うことができます( have_many veterinarianpets

Ownerとは両方ともSTIを使用するVeterinarianサブクラスです。User

ここにいくつかのコードがあります:

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つのレコードしかないことがわかりました。pet飼い主と獣医の関係を築くたびにまったく新しいペットを作りたくないので、aは伝統的な意味での結合テーブルではないことを理解しています。Ownerhas_many Pets、Petbelongs_to:owner、Pethas_and_belongs_to_many sのようなスキーマを使用する必要がありますVeterinarianか?

ありがとう!

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 に答える