0

在我的居民协会 Rails 数据库中,我有 User、Plot 和 House 模型。(空地,拥有一栋或多栋房屋的地块,业主或租户居住的地方)。从数据库的角度来看,我将需要各种关系,例如

  • PlotHouse - plot_id 上的 house_id
  • PlotOwnership - user_id 拥有 plot_id
  • HouseOwnership - user_id 只拥有 house_id 但不拥有地块
  • 出租 - user_id 出租 house_id
  • 亲属 - 业主或租户的关系

从功能和用户界面的角度来看,我需要具有不同角色的成员模型 - PlotOwners、HouseOwners、Tenants、Owner's Relatives、Tenant's relatives。我可以用现有的模型和关系做到这一点。

问题:在显示居民时,我无法根据用户或房屋属性中的任何一个对它们进行排序,因为它们来自不同的表。如果我使用来自 User、Plot、House 模型的列创建成员模型,我将复制这些列,因此存在数据库中不一致的风险。

我有 CS 背景,但不是生产级数据库设计、Rails 或其他。由于经常需要成员数据,只要我可以在系统中强制执行完整性,复制这些列是否合理?除了对内存中的数据进行排序之外,还有其他选择吗?

我将不同角色的成员视为报告,但由于经常需要它们,因此需要保留它们,因此需要重复查看,但用户/绘图/模型的基本模型似乎是管理员没有重复的方法。我的理解有差距吗?

  • 贾亚万特
4

1 回答 1

0

我认为你可以用四个模型来做到这一点。

  1. 用户(id,其他列)
  2. 绘图(id,其他列)
  3. 房屋(id、plot_id、其他列)
  4. UserAssociation/一些直观的名称,用于将用户与地块/房屋相关联(id、user_id、associable_id、associable_type、角色)

您可以使用多态关联将您的用户与仅来自一个模型的地块和房屋相关联。以下是您需要的关联。

class User < ActiveRecord:Base
  has_many :user_associations
  has_many :plots, :through => :user_associations, :source => :associable, :source_type => 'Plot'
  has_many :houses, :through => :user_associations, :source => :associable, :source_type => 'House'
end

class Plot < ActiveRecord:Base
  has_many :houses
  has_many :user_associations, :as => :associable
  has_many :users, :through => :user_associations
end

class House < ActiveRecord:Base
  belongs_to :plot
  has_many :user_associations, :as => :associable
  has_many :users, :through => :user_associations
end

class UserAssociation < ActiveRecord:Base
  belongs_to :user
  belongs_to :associable, :polymorphic => true
end
于 2013-02-15T04:32:44.260 回答