#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