

## 概要

ApplicationRecordでHogeModuleをincludeするようになっていて、  
ApplicationRecordを継承するとModuleがincludeされてしまう。

PiyoClassではincludeしたくない場合にどのように実現すべきかの助言を頂きたいです。

[code]

    class ApplicationRecord < ActiveRecord::Base
      include HogeModule
    end
    
[/code]

[code]

    class PiyoClass < ApplicationRecord
      # このクラスではHogeModuleをincludeしたくない
    end
    
[/code]

## 試したこと

「`method_missing': undefined method`include_class?'」となってしまう

[code]

    class ApplicationRecord < ActiveRecord::Base
      include HogeModule if include_class?
    
      def include_class?
        true
      end
    end
    
[/code]

[code]

    class PiyoClass < ApplicationRecord
      # このクラスではHogeModuleをincludeしたくない
      def include_class?
        false
      end
    end
    
[/code]

## 条件

以下の条件を満たしたいです

  * ApplicationRecordを継承すること
  * includeしない場合にモデルに何かしら記述する

## 環境

  * Rails5.2


CC BY-SA 4.0
2020-04-14T04:25:28.473
65602
2021-05-05T00:49:11.543
2021-05-05T00:49:11.543
19110
29989
question
ruby-on-rails ruby
特定のmodelでModuleをincludeしないようにしたい


自分の知る限り、一度 include した module を uninclude することはできない気がしているので、

[code]

    class ApplicationRecord < ActiveRecord::Base
    end
    
    class HogeApplicationRecord < ApplicationRecord
      include HogeModule
    
      self.abstract_class = true
    end
    
    class PiyoClass < ApplicationRecord
    end
    
    # それ以外のクラスは HogeApplicationRecord を継承する
    
[/code]

とするのが、妥当な解答かなと思っています。


CC BY-SA 4.0
2020-04-14T04:32:30.463
65603
2020-04-14T06:21:05.240
2020-04-14T06:21:05.240
754
754
65602
answer


一つの技法として、`Class#inherited`を活用する方法があります。

[code]

    module MyMudule
      def hello
        puts 'hello'
      end
    end
    
    class Parent
      def self.inherited(subclass)
        subclass.include MyMudule if subclass.name == 'Child1'
      end
    end
    
    class Child1 < Parent
    end
    
    class Child2 < Parent
    end
    
    child1 = Child1.new
    puts child1.respond_to?(:hello) # => true
    child2 = Child2.new
    puts child2.respond_to?(:hello) # => false
    
[/code]

このように、特定の名前の子クラスのみで`include`を行ったり、逆に`include`を行わなかったりできます。  
この方法の欠点としては親クラスが「どのクラスがモジュールを継承するか（またはしないか）」の知識を持たなくてはならないことです。単に親クラスを2つに分ける方法と比較するとこちらのほうが可読性には劣ります。


CC BY-SA 4.0
2020-04-14T08:29:50.983
65608
2020-04-14T08:29:50.983
442
65602
answer