kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

Rubyのモジュール

コードを整理する際に、classではなく、moduleで整理したいと思う場面がありました。

Railsで書いていることもあり、ActiveSupport::Concernにまとめる形にします、 moduleクラスに機能を混ぜ合わせることで複数のクラスで機能を共有する(Mix-in)という機能を提供しています。

さらにActiveSupport::Concernは、関心事を分離するために独立した機能を定義したモジュールが配置されますので、これを利用することにします。

ActiveSupport::Concern

module DataAble
  extend ActiveSupport::Concern
  
  included do
    scope :with_deleted -> { where.not(deleted_at: nil) }
    scope :without_deleted -> { where(deleted_at: nil) }
  end

  def set_data
    @data = Data.pluck(:id, :name)
  end
end
class Hoge
  include SetDataAble
end

これで, できるようになります。

@hoge = Hoge.new
@hoge.set_date

Hoge.with_deleted

参考

ruby on rails - なぜRailsのモジュールでは"able"をサフィックスとして付けるのでしょうか? - スタック・オーバーフロー