如何使用别名在模型 class 中包含模块?

How to include a module in a model class with alias?

我目前正在使用 RailsMongoid。 假设我有以下模型:

class User
  include Name
end

还有一个Name模块:

module Name
  included do
    field :name, type: String

    #other methods here...
  end
end

问题

现在我希望 User 有两个字段:namenickname,两者都使用 Name 模块。我应该怎么做?谢谢。

编辑

说明一下,namenickname有一些方法是相同的,但是昵称本身也有一些特殊的方法。 例如,namenickname 都可以执行以下操作:

def greeting(name)
  p "hello #{name}!"
end

但是,只有 nickname 可以执行以下操作:

def friendly_greeting(name)
  p "hello #{name}! You can call me #{nickname}"
end

我的第一个想法是创建 2 个模块,NameNickname,让 Nickname 成为 Name 的子类。但是它们都是模块所以我不知道这是否有效。

模块不是 类,因此不能使用经典的层次继承。然而,一个模块可以包含其他模块——这意味着您可以使用并行继承。

module Name
  extend ActiveSupport::Concern

  included do
    field :name, type: String
  end

  def greeting(name)
    p "hello #{name}!"
  end
end

module Nickname
  extend ActiveSupport::Concern

  include Name

  included do
    field :nickname, type: String
  end

  # if you named this method greeting it would
  # overwrite the implementation from the Name module
  def friendly_greeting(name)
    p "hello #{name}! You can call me #{nickname}"
  end
end

class Foo 
  include Name
end

class Bar
  include Nickname
end

Foo.new.name # nil
Foo.new.nickname # NoMethodError

Foo.fields.keys # ['_id', 'name']
Bar.fields.keys # ['_id', 'name', 'nickname']

Foo.new(name: 'Max').greeting # "hello Max!"
Foo.new(name: 'Max').friendly_greeting # NoMethodError

bar = Bar.new(name: 'Richard', nickname: 'Dick')
bar.greeting # "hello Richard!"
bar.friendly_greeting # "hello Richard! You can call me Dick"