Ruby on rails Rails中基于关联值的自定义验证器
我的应用程序有3个模型(Foo、Bar和Baz) 我试图找到最直观的方法来验证Baz(price)中的属性,而不是Foo中设置的限制(:min_price和:max_price)。Baz模型中的价格必须介于Foo设定的限制之间 目前,我正在尝试使用自定义PriceLimitValidator实现它:Ruby on rails Rails中基于关联值的自定义验证器,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我的应用程序有3个模型(Foo、Bar和Baz) 我试图找到最直观的方法来验证Baz(price)中的属性,而不是Foo中设置的限制(:min_price和:max_price)。Baz模型中的价格必须介于Foo设定的限制之间 目前,我正在尝试使用自定义PriceLimitValidator实现它: class PriceLimitValidator < ActiveModel::Validator def validate(record) unless ( record.pr
class PriceLimitValidator < ActiveModel::Validator
def validate(record)
unless ( record.price <= record.bar.foo.max_price && record.price >= record.bar.foo.min_price )
record.errors[:price] << 'Price limit exceeded!'
end
end
end
class PriceLimitValidator record.errors[:price]可能不存在.bar或.bar.foo。我将以以下方式实施:
class Foo
validates_presence_of :min_price, :max_price
end
class Baz
belongs_to :bar
has_one :foo, through: :bar
validates_presence_of :foo
def min_price
foo.try(:min_price)
end
def max_price
foo.try(:min_price)
end
end
class PriceLimitValidator < ActiveModel::Validator
def validate(record)
return if record.min_price.nil? || record.max_price.nil?
unless record.price.between?(record.min_price, record.max_price)
record.errors[:price] << 'Price limit exceeded!'
end
end
end
class-Foo
验证是否存在:最低价格,:最高价格
结束
Baz类
属于:酒吧
有一个:foo,通过::bar
验证是否存在:foo
def最低价格
foo.try(:最低价格)
结束
def最高价格
foo.try(:最低价格)
结束
结束
类PriceLimitValidator record.errors[:price]Rails提供了基于Ruby范围功能的即时验证
例如:
validates_numericality_of :width, less_than: ->(person) { person.height }, :greater_than... etc. }
完整的规范及其无数的选项如下:显示完整的错误堆栈..不相关,但has_many:baz
应该是has_many:baz
。。复数..您将自定义验证器放在哪个模型中max_price
和min_price
是模型属性?Rails提供了一些基于Ruby系列功能的即时验证。例如,验证:width,less,\u than:->(person){person.height},:than的\u numericality\u。。。等。)是记录价格还是记录价格金额?你两者都用。
validates_numericality_of :width, less_than: ->(person) { person.height }, :greater_than... etc. }