2012-04-23 97 views
1

我在轨的新手,我想知道我应该怎么做这样的事情:轨道的方法来创建复杂的用户结构

我创建有两个主要用户群的应用程序,让我们呼唤他们的客户和供应商。

我应该如何实现这一点,牢记那些similarites和区别:

差异:

  • 从企业角度看这两个群体是独立的,一般客户是从供应商处购买。
  • 他们主要与不同的模型相关联,供应商90%的时间使用应用程序的后端和客户只有前端。
  • 用户帐户manamegent是完全不同的

相似之处:

  • 对于这两个我想用一些基于角色的授权解决方案
  • 他们都登录
  • (前declarative authorization)。在极少数情况下,通过相同的控制器/视图与相同的型号进行交互

什么是最好的解决方案,以保持简单和干净的同时?一个胖客户模型与客户和供应商模型相关联?用重复登录逻辑分离模型(它如何与声明性授权一起工作)?单表继承(又是如何声明授权)?

+0

您正在为大多数人单独解决多个问题提供解决方案。您正在尝试执行角色授权,并在您的数据模型中包含客户和供应商数据实体。这并不是坏事,但其他程序员的经验可能会有所不同。 – 2012-04-23 21:09:51

回答

2

我会创建一个User类来处理授权等任何事情,以及系统中所有用户具有的其他基本功能。然后创建分别从User继承的CustomerVendor类,并拥有自己的业务逻辑。 Rails中的STI使其非常简单 - 创建一个type列,它将自动填充类名称。

您可以使用像CanCan这样的宝石分离每种User的权限。

+0

我同意。在User和Role之间添加一个Role类和一个多对多的类。我将该名称命名为RoleMembership。我在ApplicationController的before_filter中执行授权。我也有一个表,哪个角色可以访问哪些控制器。 – 2012-04-23 21:11:24

+0

谢谢我要这么做,希望STI不会出现使用诸如CanCan或声明授权等宝石的问题 – fobb 2012-04-24 06:30:25

1

好的,我在工作时正在进行一次StackOverflow中断,然后工作把我叫走,所以我很快就回复了。你将不得不决定是否要使用STI,

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users do |table| 
     table.string "type" 
... 

和存储您的供应商和客户对象实例的用户表,或使用多表继承,你只是简单的有

class Vendor < ActiveRecord::Base 
    belongs_to :user 
... 
class Customer < ActiveRecord::Base 
    belongs_to :user 
... 

如果您的供应商和/或客户对象具有特定的状态数据(例如供应商的销售代表或客户的购买历史记录),则需要MTI。好的,购买历史记录可能是对belongs_to:customer的其他表的连接,但是当用户可以成为供应商时,将连接的记录belongs_to:user看起来可能很尴尬。

现在,为了配合访问控制,...我已经实现了access_control_items表,

class CreateAccessControlItems < ActiveRecord::Migration 
    def change 
    create_table "access_control_items", :force => true do |table| 
     table.timestamps 
     table.string "controller" 
     table.string "action" 
     table.string "group_type", :null => false 
     table.integer "group_id", :null => false 
    end 
    end 
end 

关键的一点是,我从角色的访问控制分离的成员,并使其多态的,所以它可能是成员的任何物品与包括哪些?(用户)方法。我的应用程序控制器在方法之前将当前登录的用户发送给包含?由控制器和操作的任何access_control_items匹配引用的组的方法。

因此,该组可能指向某个ActiveRecord类的实例,如果该用户是供应商(在STI中具有type =“Vendor”或has_one,那么该类可能会响应true以包含?(用户) :供应商不是在MTI零)。

在实践中,请继续使用宝石,如果你喜欢,可以扫描。但考虑一下为自己的应用程序逻辑解耦设计的例子。