0

在我的应用程序中有两个types用户(运动员和用户)。Athlete继承User类,因为它使用 STI 设置。还有其他类型的用户,但这些类型的用户是根据他们的角色设置的。

例子:

教练 -->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 的角色时才能包含该模块?

4

1 回答 1

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 文档 - Object#extend

于 2013-11-01T14:23:23.580 回答