0

我现在处于应用程序的设计阶段。主要是在纸上做一些事情来了解应用程序模型,定义我需要什么等等。我发现了一个问题,我不知道如何解决,或者更具体地说,我不知道如何实现它以保持干燥。所以这里是交易:

我有应用程序,其中将是三种不同类型的用户/帐户:

  1. 普通账户- 账户在应用程序中有基本的个人资料和基本权限,普通账户的用户可以看到每个人的公开个人资料,可以修改自己的个人资料,只能有一张个人资料图片,可以搜索等。

  2. 高级帐户- 具有高级配置文件,这意味着用户可以指定联系信息,外观详细信息,具有预订页面,可以获取报价,具有日历

  3. 公司帐户- 具有包含公司联系信息的公司资料,可以向高级用户提供报价,并可以浏览应用程序中的所有资料

所以基本上,我为所有用户提供了一个用户模型,我决定使用 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

还是我走错了路?这个问题的最佳做法是什么?感谢您的建议!

4

2 回答 2

2

我发现cancan gem 对于管理用户能力和授权非常有用,而不是为不同类型的用户管理单独的模型。我过去使用这篇博客文章来设置它,尽管它现在可能已经过时了。

于 2013-03-17T03:56:48.467 回答
0

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

@user = is_advanced?

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

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

于 2013-03-17T03:56:22.527 回答