建立两个相关联接表之间关系的Rails方式,并同时强制执行数据完整性

问题描述

让我在玩具模式中拥有以下这些实体:建筑物,公寓,租户,维护人员。

这是这些实体之间的联系方式:

  • 建筑物有很多租户。
  • 租户也可以通过“公寓”属于许多建筑物。

因此,从本质上讲,这是建筑物和租户之间通过公寓进行的多对多关系。

现在,我想在系统中添加MaintenancePerson。 MaintenancePerson可以与系统中的每个级别相关联。

  • MaintenancePerson可以与许多建筑物关联。建筑物也可以有许多维护人员。
  • MaintenancePerson可以与许多公寓关联。一个公寓还可以有许多维护人员。该公寓的维护人员应该是分配给该公寓所在建筑物的维护人员。

我可以使用以下表格:

Apartments
  id
  building_id
  tenant_id

MaintenancePersonBuildingAssignments
   id
   maintenance_person_id
   building_id
   <attributes>

MaintenancePersonApartmentAssignments
   id
   maintenance_person_building_assignments_id
   apartment_id
   <attributes>

现在,在maintenance_person_apartment_assignments中,可以从maintenance_person_building_assignments_id和apartment_id两者推断出building_id。 此外,如果我使用maintenance_person_id而不是maintenance_person_building_assignments_id,则无法确保该建筑物的维护人员已经存在。

解决此问题的“铁路方式”是什么?

解决方法

听起来您将具有以下ActiveRecord类关系:

class Building < ApplicationRecord
  has_many :apartments
  has_many :tenants,through: :apartments
end

class Apartment < ApplicationRecord
  belongs_to :building
  belongs_to :tenant
  has_and_belongs_to_many :maintenance_persons
end

class Tenant < ApplicationRecord
  has_many :apartments
end

class MaintenancePerson < ApplicationRecord
  has_and_belongs_to_many :apartments
end

为了支持has_and_belongs_to_manyApartment之间的MaintenancePerson关系,将存在一个带有apartments_maintenance_personsapartment_id列的名为maintenance_person_id的连接表。 / p>