2012-04-10 12 views
1

私は、ペットと獣医師に必要なデータのかなり簡単なセットを持っています。Rails:モデリング直感的なデータhas_manyを使用する:through

  • ownerを有することができ、多くのpets
  • petが多く(belongs_toの)により処理することができる有することができるveterinarians
  • veterinarianを扱うことができ(have_many)pets

OwnerおよびVeterinarianは、 STIを使用して両方のサブクラス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 => '[email protected]') 
    v1 = Veterinarian.make!(:email => '[email protected]') 
    v2 = Veterinarian.make!(:email => '[email protected]') 
    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!ものは機械工器具の交換を使用して行うことです。ファクトリはオブジェクトを作成するだけです。

エラーは最後の行で発生します。獣医師は1レコードしか持っていないことが判明しました。私はpetが所有者と獣医師の間に関係を作るたびに新しいペットを作りたくないので、従来の意味での結合表ではないことを理解しています。 Owner has_many Pet s、Pet belongs_to:owner、Pet has_and_belongs_to_many Veterinarianのようなスキーマを使用する必要がありますか?

ありがとうございます!

答えて

1

PetVeterinarianの間の結合テーブルを使用する必要があります。それを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 
関連する問題