Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中基于关联值的自定义验证器_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails Rails中基于关联值的自定义验证器

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

我的应用程序有3个模型(Foo、Bar和Baz)

我试图找到最直观的方法来验证Baz(price)中的属性,而不是Foo中设置的限制(:min_price和:max_price)。Baz模型中的价格必须介于Foo设定的限制之间

目前,我正在尝试使用自定义PriceLimitValidator实现它:

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 PriceLimitValidatorrecord.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(:最低价格)
结束
结束
类PriceLimitValidatorrecord.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. }