在ActiveModel之间共享方法

时间:2018-09-26 07:50:27

标签: ruby-on-rails

我有一个简单的问题,但是我不知道最好的方法是什么。

我有两个ActiveModel类(例如SimpleUser和User)。我想在它们之间共享一些方法的实现(例如,将名字和姓氏汇总在一起的full_name方法,以保持简单)。

在经典的OO语言中,我将使用我的两个类可以扩展的抽象类。但是在Ruby(甚至是Rails)中,最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以将代码放入app/models/concerns中,并将它们包括在两个模型中。 例如:

  • app / models / concerns / user / shared_methods.rb
module Concerns::User::SharedMethods
  extend ActiveSupport::Concern
  def full_name
    ...
  end
end
  • app / models / user.rb
class User < ActiveRecord::Base
  include Concerns::User::SharedMethods
  ...
end
  • app / models / simple_user.rb
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