0

我正在编写我的第一个 Ruby On Rails 应用程序——一个用于封闭式住宅社区的网站。

社区区域由空地组成,在建成地块中有一个或多个房屋。地块只有一个所有者,但地块中的多个房屋可以各自拥有不同的所有者。有不同角色的选举产生的办公室负责人(在居民协会中)和物业管理人员等。最终会有用户组(仅限业主或仅限租户或混合等)。

Owner 和 Tenant 往往是完全不同的,因此我将它们保留为单独的类。同样,他们的家庭成员也往往不同 - OwnerFamilyMember 和 TenantFamilyMember 类。

我的第一个设计是有一个单一的用户和一个角色和一个分配模型——角色变得太多了。因此,我如上所述拆分了用户模型(我不想使用 STI 或多态关联,我想先把它弄好)。

模型类:

# All classes below inherit from ActiveRecord::Base, removed other attributes for compactness

class Owner
    has_many :plots    
    has_many :houses   
    has_many :owner_family_members    
end

class Tenant
    belongs_to :house    # declare house_id in table
    has_many :tenant_family_members
end

class Staff ...

class Plot
    belongs_to :owner    # declare owner_id in table
end

class House
    belongs_to :owner    # declare owner_id in table
end

class OwnerFamilyMember
    belongs_to :owner    #  declare owner_id in table
end
class TenantFamilyMember
    belongs_to :tenant    #  declare tenant_id in table
end
  • 租户或业主居住在房屋中。
  • 业主或租户的家庭成员将参与社区,但他们依赖于主要业主或租户的某些特权行动

我知道,通过这种设计,不同的用户模型具有隐含的角色,并且可以根据需要具有额外的子角色 - 业主可以是居民协会的财务主管,租户可以领导一个节水团体等。我预计角色要进一步发展,因此我认为保留多个用户模型会更好。

我在正确的轨道上吗?我在这个食谱中混淆了错误的东西吗?热衷于听取任何可以帮助我更好地理解这一点的反馈、概念或具体实施。

我了解数据库概念、OO 编程,但我是生产级数据库设计或 RoR 应用程序的新手。感谢您阅读这篇长文。- 贾亚万特

4

1 回答 1

0

欢迎来到 Rails 社区!你会喜欢这里的。

首先,您无需回避 STI 或多态关联,它们在 Rails 世界中是非常有价值的工具。您的用户/角色/分配(连接表)策略似乎可以合理地处理良好的规范化身份验证和基于角色的授权方法。我会将用户模型与您的应用程序的其他逻辑完全分开,并使用 Ryan Bates 的CanCan库进行授权,并通过 Plataforma 的Devise库进行身份验证。

现在您有了一个很好的身份验证/授权设置,它不依赖于大量不同的 User/Admin/GuyWhoAuthenticates 模型,并且应用程序更加简单。前任:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    ...
    if user.has_role? 'plot_owner'
      can :manage, Plot, user_id: user.id
    end
    ...
  end
end

class User < ActiveRecord::Base

  has_many :assignments
  has_many :roles, through: :assignments

  ...

  def has_role? role
    roles.where(label: role)
  end    

  ...

end

关于其他模型,一个很好的经验法则是:它们共享多少逻辑?如果它们具有相同的属性,共享大量的应用程序逻辑并且在概念上相似(例如,作为家庭成员),那么我会选择 STI / 多态关联。如果没有,您可以将通用逻辑提取到单独的模块中,并将其包含在两个模型中。

由于您是 Rails 世界的新手,我还强烈建议您查看RailscastsPeepcode,这两个很棒的截屏网站可以让您立即像老板一样制作 Rails 应用程序:D

干杯!

于 2013-01-18T18:44:25.610 回答