Добавление проверки уникальности для динамических атрибутов в rails

#ruby-on-rails #validation #activemodel #validates-uniqueness-of

#ruby-on-rails #проверка #activemodel #проверяет уникальность

Вопрос:

У нас есть многопользовательское приложение, где проверка отличается для каждой учетной записи. Мы могли бы легко добиться этого для проверки присутствия, как показано ниже,

 module CommonValidator
  def add_custom_validation
    required_fields = get_required_fields
    return if required_fields.blank?

    validates_presence_of required_fields.map(amp;:to_sym)
  end
end

class ApplicationRecord < ActiveRecord::Base
  include Discard::Model
  include CommonValidator
end
 

Затем мы должны добавить проверку уникальности на основе учетной записи, поэтому попробовали то же самое. но получаю ошибку неопределенного метода. Есть ли какой-либо способ, которым я мог бы выполнить эту работу?

 module CommonValidator
  def add_custom_validation
    unique_fields = ['first_name']
    validates_uniqueness_of unique_fields.map(amp;:to_sym) if unique_fields.present?
  end
end
 

ошибка

Комментарии:

1. вы перезагрузили консоль?

2. Да, перезагрузил консоль. Другие методы проверки, такие как validates_numericality_of , работали хорошо. что-то странное с проверкой уникальности

Ответ №1:

validates_uniqueness_of на самом деле это метод класса (определенный в ActiveRecord::Validations::ClassMethods ), поэтому вы не можете вызвать его из контекста объекта.

В то validates_presence_of время как это и вспомогательный метод, и метод класса (определенный в ActiveModel::Validations::HelperMethods и ActiveRecord::Validations::ClassMethods ).

Если вы хотите использовать средство проверки уникальности, вы также можете определить метод add_custom_validation as a class, и тогда вы сможете его использовать. Что-то вроде,

 require 'active_support/concern'

module CommonValidator
  extend ActiveSupport::Concern

  included do
    add_custom_validation
  end

  class_methods do
    def add_custom_validation
      required_fields = get_required_fields # This will also need to be a class method now
      return if required_fields.blank?
      
      validates_uniqueness_of required_fields.map(amp;:to_sym)
    end
  end
end