Rails App有3种不同类型的用户

时间:2013-03-17 03:45:44

标签: ruby-on-rails ruby-on-rails-3 database-design activerecord models

我现在正处于申请的设计阶段。主要是在纸上做一些事情来获得应用模型的洞察力,定义我需要的东西等等。我发现有一个问题,我不知道如何解决,或者更具体,我不知道如何实现它以保持干燥。所以这是交易:

我有三种不同类型的用户/帐户的应用程序:

  1. 常规帐户 - 帐户在应用程序中具有基本权限的基本配置文件,具有常规帐户的用户可以查看每个人的公开个人资料,可以修改自己的个人资料,只能有1个个人资料图片,可以搜索等

  2. 高级帐户 - 拥有高级个人资料,这意味着用户可以指定联系信息,外观详情,有预订页面,可以获得优惠,有日历

  3. 公司帐户 - 包含公司简介,其中包含公司的联系信息,可以向高级用户提供优惠,并可以浏览应用程序中的所有个人资料

  4. 基本上,我为所有用户提供了一个用户模型,我决定使用Devise进行身份验证。创建用户后,我想向他/她显示一个他/她可以选择帐户类型的屏幕 - 常规,高级,公司。之后,他/她将拥有系统中的适当权利以及适当的个人资料。他将来无法在帐户类型之间进行更改。

    我还要保持代码清洁干燥,我很难找到最佳解决方案。现在我把头撞在墙上,因为我无法弄明白怎么做。 这是一个问题:

    应该如何看待最终的模型图。它应该是多态关联吗?或者它应该只是一般:

    class User < ActiveRecord::Base
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable
    
      attr_accessible :email, :password, :password_confirmation, :remember_me, :account_type
    
      has_one :account
      has_one :entertainer
      has_one :company
      after_create :create_account
    
      def create_account
        if self.account_type == 'Advanced'
          self.entertainer = AdvancedAccount.create(user_id: self.id)
        elsif self.account_type = "Company"
          self.company = CompanyAccount.create(user_id: self.id)
        else
          self.account = RegularAccount.create(user_id: self.id)
        end   
      end
    end
    

    或者我走错了路?这件事的最佳做法是什么? 谢谢你的建议!

2 个答案:

答案 0 :(得分:2)

我没有为不同类型的用户管理单独的模型,而是发现cancan gem对于管理用户能力和授权非常有用。我过去使用this blog post来设置它,虽然它现在可能已经过时了。

答案 1 :(得分:0)

我会在您的UsersController中使用一些方法来定义各种访问级别,例如:

@user = is_advanced?

通过这种方式,您可以允许他们选择他们将拥有的帐户类型,将该选择存储在数据库[users::account_type: integer]中。如果您决定添加该功能,这将允许您让他们在将来进行更改。

我不会在您的Users类中创建这么多关联,因为它会使您的RESTfull路由变得臃肿等,并使调试成为一场噩梦。