Abstractクラス。

class Curry < ActiveRecord::Base; end
class SeafoodCurry < Curry; end
class VegetableCurry < Curry; end

という関係のクラスがあって、CurryをAbstractクラスのようにしたかったので

validates_presence_of :type

を付けたのだけれど、これって普通のことなのかどうか気になる。
あと、出来心でtypeを存在しないクラス名に変えたら

ActiveRecord::SubclassNotFound: The single-table inheritance mechanism failed to locate the subclass

とおこられてARから触れなくなってしまった。ご注意。(って、普通はやらんか。)

コメント

  1. 芳賀 より:

    お久しぶりです。元W社の芳賀です。

    Abstractクラスの書き方が普通かどうか私もそのような情報を見聞きしたことがありません。

    話が少し変わりますがAbstractクラスではなく、実装されたメソッドを複数のモデルで共有したい場合はモジュールを使うのが便利だとRuby on Rails 逆引きクイックリファレンスの290ページに書いてありました。

    yoshukiさんがやりたいことがポリモーフィック関連ということでしたら、やはり共通処理はモジュールを使うのが便利と同じ本の321ページに書いてありました。

  2. yoshuki より:

    おひさしぶりです。ご紹介ありがとうございます。
    メソッドの共有という意味では確かにモジュールのほうがいいと思うのですが、Curry.find(:all).rot
    (SeafoodとVegetableで挙動が明確に変わるようなメソッドが思いつかない。サンプルにしたクラスが悪かった。orz)のようなこともしたいので、このような構成になりました。

  3. 芳賀 より:

    >Curry.find(:all).rotのようなこともしたいので、

    会社に先の本を置いてきたので記憶で書きますがその本の例では事務所クラスと工場クラスがあり、それぞれ個別に使用することもあるが、この2つのクラスには共通する部分があり、ある場合ではこの2つを区別することなく使用したい。その為に2つのクラスを抽象化した仕事場クラスを用意する。

    yoshukiさんのCurryクラスはまさに仕事場クラスに該当するように思えます。

    私はポリモーフィック関連という機能をActiveRecordで使えることをこの本で初めて知り、且つ会社に本を置いてきたのであまり詳しいことは今言えませんがポリモーフィック関連に見えてしょうがないので良かったら調べてみてください。

  4. yoshuki より:

    ポリモーフィック関連というのはbelongs_toによって関連づける相手クラスを抽象化したいときに使うものです。
    たとえばPersonというクラスがあったとして、それに対してSeafoodCurryやVegetableCurryを抽象化してCurryとして見せる場合に使うことができます。
    わたしのこのケースは単一テーブル継承なので、ちょっと違います。

    どちらもポリモーフィズムなのでたしかに見た目はおなじですね。
    オンラインのソースでは、
    http://www.web-career.com/seminar/pdf/2007_1018.pdf
    こちらのP33~42で解説されてます。

  5. 芳賀 より:

    なるほど単一テーブル継承だったんですね。
    助言したつもりが、こちらが勉強になってしまいました。ありがとうございました。

タイトルとURLをコピーしました