Проверка правильности значений в массиве Rails
В моей модели расписания я хочу добавить некоторую проверку в поле: wdays, которое является int []. Мне нужны только значения 0..6
Действительно
Schedule.wdays = [0,1,6]
Недопустимый
Schedule.wdays = [0,1,10]
Я попытался использовать
validates :wdays, inclusion: { in: [0, 1, 2, 3, 4, 5, 6] }
и
validates :wdays, inclusion: { in: 0..6 }
но не работает
Каков правильный способ проверки значений в массиве в вашей модели?
Ответы
Ответ 1
Я не думаю, что стандартные валидаторы Rails будут делать трюк здесь, вы можете сделать это, хотя:
validate :validate_wdays
def validate_wdays
if !wdays.is_a?(Array) || wdays.detect{|d| !(0..6).include?(d)}
errors.add(:wdays, :invalid)
end
end
Ответ 2
Я не уверен, есть ли более простые способы справиться с этим в существующей структуре проверки Rails. У вас странный случай, когда валидаторы не были созданы для обработки. Возможно, вам потребуется написать специальный валидатор для чего-то вроде этого (при условии, что существующий флажок расширения проверки не доступен). Что-то вроде этого:
class ArrayInRangeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, valueArray)
valueArray.each do |value|
record.errors.add "#{attribute} - #{value}", (options[:message] || "is not in the acceptable range") unless (1..6).include?(value)
end
end
end
а затем в вашей модели:
class Schedule < ActiveRecord::Base
include ActiveModel::Validations
validates :wdays, :presence => true, :array_in_range => true
... other model stuff
end
Ответ 3
Я создал этот камень:
https://github.com/rafaelbiriba/active_model_validates_intersection_of
В основном, вы можете использовать как:
class User < ActiveRecord::Base
DEFAULT_PERMISSION = ["read", "write", "share"]
validates_intersection_of :permission, in: DEFAULT_PERMISSION
end
и если вы попробуете:
user = User.new(permission: ["read", "share"])
user.valid? #true
user = User.new(permission: ["read", "admin"])
user.valid? #false
Наслаждайтесь! Комментарии, тянуть запросы и отзывы всегда приветствуются.