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 回答