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
为了支持Apartment
和MaintenancePerson
之间的has_and_belongs_to_many
关系,将存在一个名为apartments_maintenance_persons
的连接表,其中包含apartment_id
和maintenance_person_id
列。
【讨论】:
以上是关于Rails 方法用于两个相关连接表之间的关系并同时强制数据完整性的主要内容,如果未能解决你的问题,请参考以下文章