Rails使用来自其他模型的数据进行范围验证

时间:2014-09-19 18:06:44

标签: ruby-on-rails validation

我有一个Ticket and Event模型,其中的关系是Event有很多Tickets。 Ticket模型具有列序列起始值和串行结束值,表示该事件的有效串行nubers的范围。

我想在创建时验证故障单,这样如果使用超出该范围的序列号创建故障单,系统将发出错误,指出该范围无效。

我目前在票证模型验证中的另一个验证是显示140000到149999之间所有事件的有效序列号

validates  :serial_number,
            presence: true,
            numericality: { 
                only_integer: true, 
                :greater_than_or_equal_to => 140000,
                :less_than => 149999, 
                :message => "is invalid" },
            :uniqueness => { :message => "%{value} has already been taken" }

我需要从Event模型中获取数据并将其放入Ticket验证中。 Rails在模型中是否允许这样的东西?我应该在控制器中做到吗?

2 个答案:

答案 0 :(得分:3)

绝对在您的模型中执行此操作。使用custom validations

validate :serial_number_valid

def serial_number_valid
  unless event.serial_number_range.include?(serial_number)
    errors.add(:serial_number, "must be within range")
  end
end

答案 1 :(得分:0)

执行此操作的一种方法是使用inclusion的rails validation helper。此帮助程序验证属性的值是否包含在给定集中。对于这种特殊情况,您可以使用:

validates :serial_number, inclusion: { in: 140000..149999 }, presence: true, uniqueness: true

如果你想在rails 4中使用相同的方法,那么这里就是link

相关问题