如何使用别名在模型 class 中包含模块?
How to include a module in a model class with alias?
我目前正在使用 Rails
和 Mongoid
。
假设我有以下模型:
class User
include Name
end
还有一个Name
模块:
module Name
included do
field :name, type: String
#other methods here...
end
end
问题
现在我希望 User
有两个字段:name
和 nickname
,两者都使用 Name
模块。我应该怎么做?谢谢。
编辑
说明一下,name
和nickname
有一些方法是相同的,但是昵称本身也有一些特殊的方法。
例如,name
和 nickname
都可以执行以下操作:
def greeting(name)
p "hello #{name}!"
end
但是,只有 nickname
可以执行以下操作:
def friendly_greeting(name)
p "hello #{name}! You can call me #{nickname}"
end
我的第一个想法是创建 2 个模块,Name
和 Nickname
,让 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"
我目前正在使用 Rails
和 Mongoid
。
假设我有以下模型:
class User
include Name
end
还有一个Name
模块:
module Name
included do
field :name, type: String
#other methods here...
end
end
问题
现在我希望 User
有两个字段:name
和 nickname
,两者都使用 Name
模块。我应该怎么做?谢谢。
编辑
说明一下,name
和nickname
有一些方法是相同的,但是昵称本身也有一些特殊的方法。
例如,name
和 nickname
都可以执行以下操作:
def greeting(name)
p "hello #{name}!"
end
但是,只有 nickname
可以执行以下操作:
def friendly_greeting(name)
p "hello #{name}! You can call me #{nickname}"
end
我的第一个想法是创建 2 个模块,Name
和 Nickname
,让 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"