2

如果已经回答了这个问题,请原谅我,但我已经搜索了很多,仍然需要一些澄清。

我正在使用 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 属性。

目标

我试图确保我的代码尽可能地遵循最佳实践,这样当我添加新功能和扩展时,我就不必重新编写应用程序的大部分内容。

我非常感谢您的反馈。

参考

我读过的一些帖子。希望能帮助其他人试图解决同样的问题。

设计 Rails 应用程序:单表继承?

具有不同用户类型的 Ruby on rails

多种类型的 Ruby On Rails 用户模型

4

1 回答 1

2

可能为时已晚,但您也可以使用has_and_belongs_to_manyon UserCompany从而通过使用 gems canscanrolify完全避免 STI 。它允许您定义细粒度的访问权限(能力)。

我知道拥有不同的类而不是角色似乎更优雅,但这不是可行的长期策略,当逻辑变得复杂时它会变得混乱。

除此之外,其余的似乎很可靠,希望对您有所帮助:)

于 2013-06-14T21:58:48.793 回答