2012-04-20 12 views
2

私は多くのサブモデルを実装している抽象モデルを持っています。私は、サブモデル上で呼び出されたときにサブモデル自身の定義に依存する抽象モデル内のいくつかの関数を定義できるようにしたいと考えています。 Ruby on Railsではそういったことが可能ですか?Ruby on Rails:サブクラスのC++仮想メソッドに似たものはありますか?

長さ属性はサブモデルで定義されている例、:

class Animal 
    validates_inclusion_of :length, :in => MIN_LENGTH..MAX_LENGTH 
end 

class Elephant < Animal 
    MIN_LENGTH = 5 
    MAX_LENGTH = 20 
end 

その後、私はElephant.new.saveに行くとき! Elephantの定数で検証を実行したいと思います。

このような検証が行われるという事実は、すべてのサブモデルに共通することになるため、定数の値だけが変化します。

このようにしたかったのですが、どちらの場合も、小文字の方法では、未定義の値に対して名前エラーが発生しました。

Railsでこのようなことが可能ですか?

答えて

4
validates_inclusion_of :length, :in => MIN_LENGTH..MAX_LENGTH 

は、RubyがあなたのAnimalクラスを見るときに実行されます。だから当時は当時のようにMIN/MAX_LENGTHという値を使っています。この動作を上書きするには、これを行うことができます。

validates_inclusion_of :length, :in => lambda {|animal| animal.class.age_range } 

はその後、両方のあなたのAnimalElephantクラスで定義(または単に最後に、あなたが計画していない場合に「出産した」「ただAnimal」へ) :

def self.age_range 
    # < some suitable range, like 5..20 > 
end 

それが必要とされるとき:inのためのあなたの範囲は、いくつかの種に適した範囲で:inを提供し、計算されますこの方法です。

P.S.私はちょうどいくつかのキーストロークを保存するためにあなたのAnimalの基本クラスを省略したと思います;)

+0

これは確かですか?間違いなく私には素晴らしいアイデアのように聞こえます。しかし、Railsは、ラムダ関数に動物を渡すのではなく、コンテナを指すことを期待しているようです。これは私が得ているエラーです - ArgumentError:メソッドを含むオブジェクトが含まれていますか?設定ハッシュの:inオプションとして指定する必要があります。 –

+0

はい、確信しています。 HeresのAPIドキュメントからの抜粋: 'validates_inclusion_of:states、:in => lambda {| person | STATES [person.country]} '。さらに、私はそれを答える前にテストしました。 – jdoe

+0

ああ、それを考え出した。これは2011年4月10日に追加されたように見えます。これはおそらく、少なくともRails 3.1から3.0に移行する必要があることを意味します。 –

関連する問題