2016-05-12 6 views
1

は、私は2つのクラス別のクラスから継承し、ActiveRecordは::ベース

class Animal < ActiveRecord::Base; end

class Kitty < Animal; end

しかし、私Kitty.find_by_name('Ser Pounce')、私は私が実際にKittyを作成したにも関わらず、Animalsテーブルを照会していますことを見つけるを持っていますテーブルを移行します。

Kitty.find_by_nameKittyテーブルを照会し、親テーブルはAnimalsではないことをレールにどのように伝えることができますか?

答えて

3

ActiveRecordを継承するモデルから継承するパターンは、Single Table Inheritanceのパターンです。 STIを使用する代わりに(実際にあなたが望むものでない限り)、私は行動ミックスインパターンを使用します。基本的に、あなたが持っていると思いますので、動物のモジュールと使用は、含まれます、その後

module Animal; end 

class Kitty < ActiveRecord::Base 
    include Animal 
end 

おそらくモデルごとに異なるテーブルを維持し、まだ行動様式のOOを維持する最も簡単な方法だこと。

2

本当に答えは、機能の共有、単一テーブルの継承、または複数のテーブルの継承に依存しています。

あなたはabstract_class属性を経由して、デフォルトSTIの動作をオーバーライドすることができます:Animal

class Animal < ActiveRecord::Base 
    self.abstract_class = true 
end 

任意のサブクラスは、その後、独自のテーブルを使用します。

わずかなの欠点があります。スーパークラスで定義されたスコープは機能しません。代わりにクラスメソッドを使用してそれらを定義する必要があります。

+0

サブクラスの 'table_name'を手動で設定する必要があることに注意してください。 – photoionized

+2

@photoionized、本当ですか?私は現時点でこれを行うアプリケーションを持っており、サブクラスはテーブルを定義する必要はありません。 – br3nt

+2

あなたは正しいです、私は間違いを犯しました、ここで私はあなたが正しいことを証明するための簡単なテストです:https://gist.github.com/photoionized/9f224c2a0f39574e1a44c21780a88fd9 – photoionized

関連する問題