복붙노트

[RUBY-ON-RAILS] 유효성 하나 개의 필드의 존재 또는 다른 (XOR)

RUBY-ON-RAILS

유효성 하나 개의 필드의 존재 또는 다른 (XOR)

어떻게 하나 개의 필드 또는 다른 존재가 아니라 모두와 적어도 하나의 유효성을 검사합니까?

해결법

  1. ==============================

    1.당신이 그렇게 같은 numericality 검증에 조건문을 추가하는 경우 코드는 작동합니다 :

    당신이 그렇게 같은 numericality 검증에 조건문을 추가하는 경우 코드는 작동합니다 :

    class Transaction < ActiveRecord::Base
        validates_presence_of :date
        validates_presence_of :name
    
        validates_numericality_of :charge, allow_nil: true
        validates_numericality_of :payment, allow_nil: true
    
    
        validate :charge_xor_payment
    
      private
    
        def charge_xor_payment
          unless charge.blank? ^ payment.blank?
            errors.add(:base, "Specify a charge or a payment, not both")
          end
        end
    
    end
    
  2. ==============================

    2.나는 이것이 3+ 레일에서 더 관용적 생각 :

    나는 이것이 3+ 레일에서 더 관용적 생각 :

    예컨대 : _ 이름 또는 이메일 중 하나가 있는지 확인하는 경우 :

    validates :user_name, presence: true, unless: ->(user){user.email.present?}
    validates :email, presence: true, unless: ->(user){user.user_name.present?}
    
  3. ==============================

    3.레일 (3)의 예.

    레일 (3)의 예.

    class Transaction < ActiveRecord::Base
      validates_presence_of :date
      validates_presence_of :name
    
      validates_numericality_of :charge, :unless => proc{|obj| obj.charge.blank?}
      validates_numericality_of :payment, :unless => proc{|obj| obj.payment.blank?}
    
    
      validate :charge_xor_payment
    
      private
    
        def charge_xor_payment
          if !(charge.blank? ^ payment.blank?)
            errors[:base] << "Specify a charge or a payment, not both"
          end
        end
    end
    
  4. ==============================

    4.

    class Transaction < ActiveRecord::Base
        validates_presence_of :date
        validates_presence_of :name
    
        validates_numericality_of :charge, allow_nil: true
        validates_numericality_of :payment, allow_nil: true
    
    
        validate :charge_xor_payment
    
      private
    
        def charge_xor_payment
          if [charge, payment].compact.count != 1
            errors.add(:base, "Specify a charge or a payment, not both")
          end
        end
    
    end
    

    당신은 3 개 이상의 값을 사용하여이 작업을 수행 할 수 있습니다

    if [month_day, week_day, hour].compact.count != 1
    
  5. ==============================

    5.

     validate :father_or_mother
    

    #Father 성 또는 어머니 성이 필수입니다

     def father_or_mother
            if father_last_name == "Last Name" or father_last_name.blank?
               errors.add(:father_last_name, "cant blank")
               errors.add(:mother_last_name, "cant blank")
            end
     end
    

    간단한 예를 들어 위의보십시오.

  6. ==============================

    6.나는 아래이 질문에 대한 내 대답을했습니다. 설명과 :이 예제에서는 키워드 필드는 어떤이되지 빈 중 하나

    나는 아래이 질문에 대한 내 대답을했습니다. 설명과 :이 예제에서는 키워드 필드는 어떤이되지 빈 중 하나

      validate :some_was_present
    
      belongs_to :seo_customable, polymorphic: true
    
      def some_was_present
        desc = description.blank?
        errors.add(desc ? :description : :keywords, t('errors.messages.blank')) if desc && keywords.blank?
      end
    
  7. from https://stackoverflow.com/questions/2134188/validate-presence-of-one-field-or-another-xor by cc-by-sa and MIT license