我有一个简单的问题,但是我不知道最好的方法是什么。
我有两个ActiveModel类(例如SimpleUser和User)。我想在它们之间共享一些方法的实现(例如,将名字和姓氏汇总在一起的full_name方法,以保持简单)。
在经典的OO语言中,我将使用我的两个类可以扩展的抽象类。但是在Ruby(甚至是Rails)中,最好的方法是什么?
答案 0 :(得分:3)
您可以将代码放入app/models/concerns
中,并将它们包括在两个模型中。
例如:
module Concerns::User::SharedMethods
extend ActiveSupport::Concern
def full_name
...
end
end
class User < ActiveRecord::Base
include Concerns::User::SharedMethods
...
end
class SimpleUser < ActiveRecord::Base
include Concerns::User::SharedMethods
...
end
答案 1 :(得分:2)
有几种选择:
您可以创建一个模块,例如UserAttributes,该模块将包含在每个User类中
或者您可以像传统的面向对象语言一样创建基类,并将其用作抽象类。如果要确保没有人滥用它,可以将其构造函数设为私有。
它看起来像这样:
class User
private_class_method :new
end
注意:在ActiveRecord(不是ActiveModel)中,有一种使类抽象的内置方法。
self.abstract_class = true