Rails 方法用于两个相关连接表之间的关系并同时强制数据完整性

Posted

技术标签:

【中文标题】Rails 方法用于两个相关连接表之间的关系并同时强制数据完整性【英文标题】:Rails way for relationship between two related join tables and enforcing data integrity at the same time 【发布时间】:2020-11-30 10:51:46 【问题描述】:

让我在我的玩具架构中加入以下实体:Building、Apartment、Tenant、MaintenancePerson。

这就是这些实体的关联方式:

大楼有很多租户。 租户也可以通过公寓属于许多建筑物。

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

现在,我想在系统中添加 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 中,building_id 可以从maintenance_person_building_assignments_id 和apartment_id 中推断出来。 此外,如果我使用 maintenance_person_id 而不是 maintenance_person_building_assignments_id,我将无法确保该建筑物的维护人员已经存在。

解决这个问题的“Rails 方式”是什么?

【问题讨论】:

您是否看过guides.rubyonrails.org/association_basics.html 以了解 ActiveRecord 建模关系的各种方式? 是的,我有。这是我遇到的一个具体问题。我想知道 Rails 推荐的解决这个问题的方法。 【参考方案1】:

听起来你会有类似以下 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

为了支持ApartmentMaintenancePerson 之间的has_and_belongs_to_many 关系,将存在一个名为apartments_maintenance_persons 的连接表,其中包含apartment_idmaintenance_person_id 列。

【讨论】:

以上是关于Rails 方法用于两个相关连接表之间的关系并同时强制数据完整性的主要内容,如果未能解决你的问题,请参考以下文章

数据库常用SQL语句

在 ruby​​ on rails 中使用连接表

对两个事实表之间的关系建模

已经建立了两个表,请问如何用SQL语句建立关联?

Mantel test 是对两个矩阵相关关系的检验

Mantel test 是对两个矩阵相关关系的检验