如果已经回答了这个问题,请原谅我,但我已经搜索了很多,仍然需要一些澄清。
我正在使用 Rails 3.2 构建一个物业管理工具。我已经有一个用户模型和授权/身份验证代码,并具有完整的测试覆盖率。
我刚刚开始绘制模型/类/表,让自己有点困惑。
让我们从用户开始。
建模用户
我计划允许多家公司使用这个系统。每个人都会有员工(用户)。这些用户将具有不同的角色,例如经理、代理、会计师、秘书等。在大多数情况下,我计划为每个用户存储的数据将是相似的(或者我目前认为),所以我倾向于单表继承和使用类型来定义每个员工拥有的访问级别。
其次,我打算让房东和租客也登录系统。登录后,他们将能够查看有关他们拥有或租用的房产的信息——也许还会更新他们的联系方式。
我正在考虑使用多态关联来表示这些用户。
所以我目前的计划并希望得到一些反馈
用户 < ActiveRecord::BASE
Employee < User(这将有一个 STI 类型列并允许不同的员工角色)
房东<用户
租户 < 用户
这是解决这个问题的最好方法,还是我在踢自己的脚?
我有一些人建议我应该有一个“角色”表并为用户分配角色——但我觉得这不是在 Rails 中最优雅的方式。
特性
我的下一个问题是属性。现在我有一个属性模型,当我添加它们时,它们属于一个用户(即它们有一个 user_id 外键)。然后我开始思考“如果添加属性的员工(用户)离开公司或由于某种原因删除了他们的帐户会发生什么?”
那么在这种情况下,最好放弃用户/员工与财产的关联,而只是将财产链接到员工所属的公司?这样我可以把所有的employee.company.properties 都列出来吗?
业主和租户协会
假设我们让属性属于一家公司。
就联想而言,这就是我的想法。现在看它,我看到一切都属于一家公司,因为使用该系统的一家公司不应该看到另一家公司的房东/租户/雇员/财产。
class Landlord < User
belongs_to :company
has_many :properties, :through => :ownerships
end
class Tenant < User
belongs_to :company
has_one :property, :through => tenancies #you can only live at one place at a time right?
end
class Property < ActiveRecord::Base
has_many :tenants, :through => :tenancies
has_many :landlords, :through => :ownerships
belongs_to :company
end
class Company < ActiveRecord::Base
has_many :properties
has_many :employees
has_many :landlords :through => :ownerships #not sure if through is required/works here
has_many :tenants :through => :tenancies #not sure if through is required/works here
end
class Employees < User
belongs_to :company
end
特性
另外我猜我们会有不同类型的房产(商业/住宅),其中会有整栋建筑、建筑物内的公寓(单一地址)等。
与用户一样,我计划使用多态关联来定义两个子类 CommercialProperty 和 ResidentialProperty,然后使用 sti 来定义一个类型。如果类型是“多单元”,则有一个新的单元模型和一个关联,其中 Property has_many Units 和 Unit belongs_to 属性。
目标
我试图确保我的代码尽可能地遵循最佳实践,这样当我添加新功能和扩展时,我就不必重新编写应用程序的大部分内容。
我非常感谢您的反馈。
参考
我读过的一些帖子。希望能帮助其他人试图解决同样的问题。