【问题标题】:Rails: Modeling Straightforward Data Using has_many :throughRails:使用 has_many 对简单数据建模:通过
【发布时间】:2012-04-23 01:18:45
【问题描述】:

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

  • 一个owner可以有多个pets
  • 一个pet可以有一个owner
  • 一个pet 可以被(belongs_to)许多veterinarians 处理
  • 一个veterinarian可以治疗(have_many)pets

OwnerVeterinarian 都是使用 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 => '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 不是传统意义上的连接表,因为我不想每次创建所有者和兽医之间的关系时都创建一个全新的宠物。我应该使用更像Owner has_many Pets、Pet belongs_to :owner 和 Pet has_and_belongs_to_many Veterinarians 的架构吗?

谢谢!

【问题讨论】:

    标签: ruby-on-rails data-modeling has-many-through


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2015-10-27
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      相关资源
      最近更新 更多