Ruby on Rails 3.2.0 ActiveRecordを継承したクラスのサブクラスでtable_nameが指定できない:解決編

前回の記事で紹介した問題ですが、解決策を見つけたので書きます。

何のことはないです。継承がダメなら委譲ってことで無理やり。。

まず継承はあきらめて普通にサブクラス(だったやつ)はActiveRecord::Baseを継承します。

class B < ActiveRecord::Base
end

でスーパークラス(だったやつ)はmoduleにします。

module A
end

それをBでincludeします。

class B < ActiveRecord::Base
include A
self.table_name = “b”
end

で、belongs_toとかの設定をAにメソッド定義します。

module A
def self.initialize_me(active_record)
active_record.belongs_to :hoge
#…
end
end

最後にBから呼び出します。

class B < ActiveRecord::Base
include A
self.table_name = “b”
A.initialize_me(self)
end

あとは普通のMix-inを使って共通メソッドなりを定義していくだけです。
そもそも私、継承よりも委譲派だった。

ややこしや。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です