如果我有如下的ActiveRecord模型
class Foo < ActiveRecord::Base
validates_inclusion_of :value, :in => self.allowed_types
def self.allowed_types
# some code that returns an enumerable
end
end
这不起作用,因为在评估验证时尚未定义 allowed_types 方法。我能想到的所有修复基本上都是围绕将方法定义移到验证之上,以便在需要时可用。
我明白这可能更像是一个编码风格问题(我希望我的所有验证都在模型顶部,方法在底部)但我觉得应该有某种解决方案,可能涉及初始模型加载的惰性评估?
我想做的事有可能吗?我应该只在验证之上定义方法,还是有更好的验证解决方案来实现我想要的。
最佳答案
为此,您应该能够使用 lambda
语法。大概是这样的:
class Foo < ActiveRecord::Base
validates_inclusion_of :value, :in => lambda { |foo| foo.allowed_types }
def allowed_types
# some code that returns an enumerable
end
end
这样它将在每次验证时评估 lambda block 并将 Foo 的实例传递给该 block 。然后它将返回该实例中 allowed_types 的值,以便对其进行动态验证。
另请注意,我从 allowed_types 方法声明中删除了 self.
,因为那样会创建一个类方法,而不是您在这里想要的实例方法。
关于ruby-on-rails - Ruby 类评估,validates_inclusion_of 与动态数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7105865/