[英]Rails: Modeling Straightforward Data Using has_many :through
I have a pretty simple set of data requirements to do with pets and veterinarians.我有一组非常简单的数据要求与宠物和兽医有关。
owner
can have many pets
一个owner
可以养很多pets
pet
can have one owner
一只pet
可以有一个owner
pet
can be treated by (belongs_to) many veterinarians
一只pet
可以由(属于)许多veterinarians
治疗veterinarian
can treat (have_many) pets
veterinarian
可以治疗(有_很多) pets
Owner
and Veterinarian
are both subclasses of User
using STI. Owner
和Veterinarian
都是使用 STI 的User
的子类。
Here's some code:这是一些代码:
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
And here is the spec that is failing:这是失败的规范:
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
The make!
make!
stuff is to do with using machinist fixture replacement.事情与使用机械师夹具更换有关。 It just factory creates the objects.它只是工厂创建对象。
The failure occurs on the last line.失败发生在最后一行。 It turns out that o.veterinarians only has 1 record.事实证明,o.veterinarians 只有 1 条记录。 I understand that a pet
is not a join table in the traditional sense, inasmuch as I don't want to create a whole new pet each time I create a relationship between an owner and a veterinarian.我知道pet
不是传统意义上的连接表,因为我不想每次在主人和兽医之间建立关系时都创建一个全新的宠物。 Should I be using a schema more like Owner
has_many Pet
s, Pet
belongs_to:owner and Pet
has_and_belongs_to_many Veterinarian
s?我应该使用更像Owner
has_many Pet
s、 Pet
belongs_to:owner 和Pet
has_and_belongs_to_many Veterinarian
的模式吗?
Thanks!谢谢!
You have to use a join table between the Pet
and the Veterinarian
.您必须在Pet
和Veterinarian
之间使用连接表。 Let's call it Treatment
:让我们称之为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.