简体   繁体   English

Rails:使用 has_many:through 对直接数据建模

[英]Rails: Modeling Straightforward Data Using has_many :through

I have a pretty simple set of data requirements to do with pets and veterinarians.我有一组非常简单的数据要求与宠物和兽医有关。

  • An owner can have many pets一个owner可以养很多pets
  • A pet can have one owner一只pet可以有一个owner
  • A pet can be treated by (belongs_to) many veterinarians一只pet可以由(属于)许多veterinarians治疗
  • A veterinarian can treat (have_many) pets veterinarian可以治疗(有_很多) pets

Owner and Veterinarian are both subclasses of User using STI. OwnerVeterinarian都是使用 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 .您必须在PetVeterinarian之间使用连接表。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM