2

多くの実装サブモデルを持つ抽象モデルがあります。サブモデルで呼び出されたときにサブモデル自体の定義に依存する抽象モデルでいくつかの関数を定義できるようにしたいと思います。そんなことがRuby on Railsで可能なのでしょうか?

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

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

1 に答える 1

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れ、一部の種に適した範囲が提供されます。

PS私はあなたがAnimalいくつかのキーストロークを節約するためだけに基本クラスを省略したと思います;)

于 2012-04-20T06:07:00.277 に答える