복붙노트

[RUBY-ON-RAILS] 유효성 검사 고유성만을 조건의 경우 레일

RUBY-ON-RAILS

유효성 검사 고유성만을 조건의 경우 레일

나는 질문 클래스가 있습니다 :

class Question < ActiveRecord::Base
  attr_accessible :user_id, :created_on

  validates_uniqueness_of :created_on, :scope => :user_id
end

나는 고유 인덱스 및 validates_uniqueness_of를 통해 질문 클래스를 통해 데이터베이스에 고유성을 강제 할 수 있도록 주어진 사용자는 하루에 하나의 질문을 만들 수 있습니다.

내가 실행 해요 문제는 난 단지 관리자가 아닌 사용자에게 그 제약 조건을 원하는 것입니다. 그들이 원하는 그래서 관리자는 하루에 많은 질문으로 만들 수 있습니다. 우아하게 그것을 달성하는 방법에 대한 어떤 아이디어?

해결법

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

    1.당신이 중 루비의 간단한 문자열을 전달하여 검증 조건 수는 하나에 값 등의 상징으로, 발동, 또는 메소드 이름을 실행합니다 : 경우 나 : 유효성 검사에 대한 옵션에서 제외하고. 여기 몇 가지 예가 있어요.

    당신이 중 루비의 간단한 문자열을 전달하여 검증 조건 수는 하나에 값 등의 상징으로, 발동, 또는 메소드 이름을 실행합니다 : 경우 나 : 유효성 검사에 대한 옵션에서 제외하고. 여기 몇 가지 예가 있어요.

    레일 버전 5.2 이전에 당신은 문자열을 전달할 수 :

    # using a string:
    validates :name, uniqueness: true, if: 'name.present?'
    

    이후 5.2에서 문자열은 더 이상 당신에게 다음과 같은 옵션을 떠나, 지원되지 않습니다 :

    # using a Proc:
    validates :email, presence: true, if: Proc.new { |user| user.approved? }
    
    # using a Lambda (a type of proc ... and a good replacement for deprecated strings):
    validates :email, presence: true, if: -> { name.present? }
    
    # using a symbol to call a method:
    validates :address, presence: true, if: :some_complex_condition
    
    def some_complex_condition
      true # do your checking and return true or false
    end
    

    귀하의 경우에는, 당신이 뭔가를 할 수 있습니다 :

    class Question < ActiveRecord::Base
      attr_accessible :user_id, :created_on
    
      validates_uniqueness_of :created_on, :scope => :user_id, unless: Proc.new { |question| question.user.is_admin? }
    end
    

    자세한 내용은 레일 가이드에 조건부 검증 섹션에서보세요 : http://edgeguides.rubyonrails.org/active_record_validations.html#conditional-validation

  2. ==============================

    2.내가 보장에 고유성을 알고있는 유일한 방법은 데이터베이스 (예를 들어, 고유 인덱스)하는 것입니다. 모든 레일 전용 기반의 접근 방식은 경쟁 조건을 포함한다. 제약 조건을 감안할 때, 나는 가장 쉬운 것은 당신이 관리자에 null을 떠날 것 날짜와 사용자 ID의 조합을 포함하는 별도의 고유 인덱스 컬럼을 설정하는 것입니다 생각합니다.

    내가 보장에 고유성을 알고있는 유일한 방법은 데이터베이스 (예를 들어, 고유 인덱스)하는 것입니다. 모든 레일 전용 기반의 접근 방식은 경쟁 조건을 포함한다. 제약 조건을 감안할 때, 나는 가장 쉬운 것은 당신이 관리자에 null을 떠날 것 날짜와 사용자 ID의 조합을 포함하는 별도의 고유 인덱스 컬럼을 설정하는 것입니다 생각합니다.

    http://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of에서 논의 validates_uniqueness_of에 관해서는, 당신은, 경우 또는 옵션 않는 한의 사용을 통해 비 관리자에 대한 유효성 검사를 제한 할 수 있습니다

  3. ==============================

    3.그냥 validates_uniqueness_of 호출에 조건을 추가 할 수 있습니다.

    그냥 validates_uniqueness_of 호출에 조건을 추가 할 수 있습니다.

    validates_uniqueness_of :created_on, scope: :user_id, unless: :has_posted?
    def has_posted
      exists.where(user_id: user_id).where("created_at >= ?", Time.zone.now.beginning_of_day)
    end
    

    그러나 더 나은 단지 지정 유효성 검사를 만듭니다

    validate :has_not_posted
    def has_not_posted
      posted = exists.where(user: user).where("DATE(created_at) = DATE(?)", Time.now)
      errors.add(:base, "Error message") if posted
    end
    
  4. from https://stackoverflow.com/questions/20914899/rails-validate-uniqueness-only-if-conditional by cc-by-sa and MIT license