1

我是 Rails 的新手,我想知道我应该如何做这样的事情:

我正在创建一个包含两个主要用户组的应用程序,我们称他们为客户和供应商。

我应该如何实现这一点,记住这些相似点和不同点:

差异:

  • 从业务角度来看,这两个群体是分开的,一般客户都是从厂商那里购买的。
  • 它们主要与不同的模型相关联,供应商 90% 的时间使用应用程序的后端,而客户仅使用前端。
  • 用户帐户管理完全不同

相似之处:

  • 对于两者,我都想使用一些基于角色的授权解决方案(例如声明性授权
  • 他们都登录
  • 在极少数情况下,两者都通过相同的控制器/视图与相同的模型进行交互

同时保持简单和清洁的最佳解决方案是什么?一种与客户和供应商模型相关的胖用户模型?具有重复登录逻辑的单独模型(它如何与声明性授权一起使用)?单表继承(声明式授权又如何)?

4

2 回答 2

2

我将创建一个User类来处理诸如授权之类的事情以及您系统的所有用户都拥有的任何其他基本功能。然后创建独立的CustomerVendor继承自User并拥有自己的业务逻辑的类。Rails 中的 STI 让它变得非常简单——创建一个type列,它会自动填充类名。

您可以使用像CanCan这样的 gem来隔离每种类型的权限User

于 2012-04-23T20:49:54.953 回答
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。好的,购买历史很可能是与属于_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

关键是我将角色的成员资格与访问控制分离,并使其具有多态性,因此它可以是任何具有 include?(user) 方法的对象的成员资格。我的应用程序控制器之前的方法将当前登录的用户发送到包含?与控制器和操作匹配的任何 access_control_items 引用的组的方法。

因此,该组可以指向某个 ActiveRecord 类的实例,如果用户是供应商(在 STI 中具有 type = "Vendor" 或 has_one :vendor not nil,则该类可能是响应 true 以包含?(用户)的类在 MTI 中)。

在实践中,继续使用 gem,如果你愿意,可以使用 cancan。但是请考虑为您自己的应用程序逻辑解耦设计的示例。

于 2012-04-24T14:24:47.440 回答