Подтвердить что ты не робот

Проверка правильности значений в массиве 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 }

но не работает

Каков правильный способ проверки значений в массиве в вашей модели?

4b9b3361

Ответ 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

Наслаждайтесь! Комментарии, тянуть запросы и отзывы всегда приветствуются.