44570


ActiveRecord を書いていて、複数の同じ schema を持つが異なるデータを持つ DB
の同期(ただコピーというわけではなく、それぞれのデータ内容によって、更新内容をいいかんじに変える)をやりたくなりました。

その中で、複数の module に対して、まったく同じ class を定義したくなりました。具体的には、以下のようなことがやりたいと思っています。

[code]

    module Database1
      class ApplicationRecord < ActiveRecord::Base
        self.abstract_class = true
        establish_connection :database1
      end
    
      class User < ApplicationRecord
        include UserConcern
      end
    
      class Item < ApplicationRecord
        include ItemConcern
      end
    end
    
    module Database2
      class ApplicationRecord < ActiveRecord::Base
        self.abstract_class = true
        establish_connection :database2
      end
    
      class User < ApplicationRecord
        include UserConcern
      end
    
      class Item < ApplicationRecord
        include ItemConcern
      end
    end
    
[/code]

この実現のために、module たちを配列につめて、 module_eval の中で class
定義すればいいのではないかと思い、これが実現できないか試すために、以下のテストコードを書きました。

[code]

    module Database1
      class Class1; end
      puts Class1.name
    end
    
    mod = Database1
    
    mod.module_eval do
      class Class2; end
      puts Class2.name
    end
    
[/code]

実行結果は以下で、 module を開いて class 定義した場合と、 module_eval で定義した場合では、 class
の定義が行われる先が異なることに気付きました。

[code]

    Database1::Class1
    Class2
    
[/code]

### 質問

  * 複数のモジュールに対して、まったく同じ class 定義を行いたい場合、どのように記述するのが良いでしょうか? もしくはそもそも、 変数の中の module に対して、 class を定義できますか?


CC BY-SA 4.0
2018-06-05T07:57:34.280
44530
2018-06-06T15:06:11.767
754
question
ruby
変数の中の module に対して、 class を定義するには?


ActiveRecord については詳しくないので、「変数の中の module に対して、 class を定義できますか?」についてだけの回答です。

ネストではなく、`::` で繋げて class を宣言することができます。

[code]

    module Database1
      class Class1; end
      puts Class1.name
    end
    
    mod = Database1
    
    class mod::Class2; end
    puts mod::Class2.name   #=> Database1::Class2
    
[/code]


CC BY-SA 4.0
2018-06-06T15:06:11.767
44570
2018-06-06T15:06:11.767
3249
44530
answer