Rails:包括基于角色的模块

时间:2013-11-01 14:13:49

标签: ruby-on-rails module

在我的应用中,有两个types用户(运动员和用户)。 Athlete继承了使用STI设置的User类。还有其他类型的用户,但这些类型的用户是基于他们的角色设置的。

示例:

教练 - > Regular User with the role of 'Coach'
学校管理员 - > Regular User with the role of 'School Admin'
贡献者 - > Regular User with the role of Contributor

旧代码在我的应用中挥之不去曾经有Coach作为用户类型(class Coach < User;),但在我的应用中向前推进将Coach作为单一内容并没有多大意义用户类型。我将采用Coach模型中的方法并将它们移到模块中,但很想知道是否只有在用户具有Coach角色时才能包含模块?

1 个答案:

答案 0 :(得分:0)

是的,这是可能的。一种方法是:

class User < ActiveRecord::Base
  ...
  after_initialize :extend_with_role_module

  private

  def extend_with_role_module
    case role
    when 'coach'
      self.extend CoachModule
    when 'school_admin'
      self.extend SchoolAdminModule
    when 'contributor'
      self.extend Contributor
    end
  end
  ...
end

但这是一个糟糕的设计,因为after_initialize块将被加载到内存中的所有User个实例。代码可能是由于重构。

来源:Ruby 2.0.0 Docs - Object#extend