好的,我在工作时正在进行一次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零)。
在实践中,请继续使用宝石,如果你喜欢,可以扫描。但考虑一下为自己的应用程序逻辑解耦设计的例子。
您正在为大多数人单独解决多个问题提供解决方案。您正在尝试执行角色授权,并在您的数据模型中包含客户和供应商数据实体。这并不是坏事,但其他程序员的经验可能会有所不同。 – 2012-04-23 21:09:51