it-swarm.com.de

Rails validiert Werte im Array

In meinem Schedule-Modell möchte ich dem: wdays-Feld etwas Validierung hinzufügen, was ein int [] ist. Ich möchte nur, dass die Werte 0..6 gültig sind

Gültig

Schedule.wdays = [0,1,6]

Ungültig

Schedule.wdays = [0,1,10]

Ich habe es versucht

validates :wdays, inclusion: { in: [0, 1, 2, 3, 4, 5, 6] }

und 

validates :wdays, inclusion: { in: 0..6 }

aber keiner funktioniert

Wie können Sie die Werte in einem Array in Ihrem Modell überprüfen?

21
bsiddiqui

Ich glaube nicht, dass hier die Standard-Validatoren von Rails den Trick tun werden. Sie können dies jedoch tun:

validate :validate_wdays

def validate_wdays
  if !wdays.is_a?(Array) || wdays.detect{|d| !(0..6).include?(d)}
    errors.add(:wdays, :invalid)
  end
end
24
mechanicalfish

Ich bin nicht sicher, ob es innerhalb der vorhandenen Rails-Validierungsstruktur einfachere Methoden gibt, um damit umzugehen. Es gibt einen seltsamen Fall, für den die Prüfer nicht wirklich geeignet waren. Möglicherweise müssen Sie einen benutzerdefinierten Validator für so etwas schreiben (vorausgesetzt, eine vorhandene Validierungs-Erweiterung ist nicht verfügbar). Etwas wie das:

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

und dann in deinem Modell:

class Schedule < ActiveRecord::Base
    include ActiveModel::Validations

    validates :wdays, :presence => true, :array_in_range => true

    ... other model stuff
end
5
Paul Richter

Ich habe diesen Edelstein erstellt: https://github.com/rafaelbiriba/active_model_validates_intersection_of

Grundsätzlich können Sie verwenden wie:

class User < ActiveRecord::Base
   DEFAULT_PERMISSION = ["read", "write", "share"]
   validates_intersection_of :permission, in: DEFAULT_PERMISSION
end

und wenn du versuchst:

user = User.new(permission: ["read", "share"])
user.valid? #true

user = User.new(permission: ["read", "admin"])
user.valid? #false

Genießen! Kommentare, Pull-Anfragen und Feedbacks sind immer willkommen.

0
Rafael Biriba