【问题标题】:Modelling an application in Rails - mixing STI and polymorphic associations在 Rails 中建模应用程序 - 混合 STI 和多态关联
【发布时间】:2013-01-17 15:50:33
【问题描述】:

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

我正在使用 Rails 3.2 构建一个物业管理工具。我已经有一个用户模型和授权/身份验证代码,并具有完整的测试覆盖率。

我刚刚开始绘制模型/类/表,有点困惑。

让我们从用户开始。

建模用户

我计划允许多家公司使用此系统。每个人都会有员工(用户)。这些用户将具有不同的角色,例如经理、代理、会计师、秘书等。在大多数情况下,我计划为这些用户中的每一个存储的数据将是相似的(或者我目前认为)所以我倾向于单表继承并使用类型来定义每个员工的访问级别。

其次,我打算让房东和租客也登录系统。登录后,他们将能够查看有关他们拥有或租用的房产的信息 - 可能还会更新他们的联系方式。

我正在考虑使用多态关联来表示这些用户。

所以我目前的计划是,希望得到一些反馈

用户 <:base>

Employee

楼主

租户

这是解决这个问题的最佳方法还是我在自取其辱?

有人建议我应该有一个“角色”表并为用户分配角色 - 但我觉得这不是 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 属性。

目标

我正在努力确保我的代码尽可能遵循最佳实践,以便在添加新功能和扩展时不必重新编写应用程序的大部分内容。

非常感谢您的反馈。

参考

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

Designing a Rails application: single table inheritance?

Ruby on rails with different user types

Ruby On Rails User Model for multiple types

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3.2 polymorphic-associations single-table-inheritance


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多