Как иметь поддерживаемый черный список имени пользователя - PullRequest
0 голосов
/ 27 января 2019

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

Теперь я попытался с помощью validates_exclusion_of сопоставить их с in:, но возникает следующая ошибка:

неверное количество аргументов (дано 1, ожидается 0)

validates_exclusion_of :nickname, in: -> { 
  where(Blacklist.select(:name).map(&:name).uniq.to_s)
}, message: "This nickname is not allowed"

1 Ответ

0 голосов
/ 27 января 2019

Вам не нужно переносить значения, чтобы исключить их из лямбды, они будут работать как есть, если вы передадите только результат запроса Blacklist AR.

validates_exclusion_of :nickname,
                       in: Blacklist.select(:name).map(&:name).uniq.to_s,
                       message: 'This nickname is not allowed'

Обратите внимание, вы можете использовать ActiveRecord :: Calculations # pluck , чтобы получить только имена из черного списка, избавиться от комбинации выбора и сопоставления и использовать ActiveRecord :: QueryMethod # Different , чтобы получить неповторяющиеся значения.

При этом вам не нужны шаги uniq и to_s.Последний, потому что проверка ожидает перечисляемый объект, и вы будете передавать строку.

Что-то вроде:

validates_exclusion_of :nickname,
                       in: Blacklist.distinct.pluck(:name),
                       message: 'This nickname is not allowed'

where, который вы используете напроверка не будет работать, так как она применяет инструкцию WHERE без передачи имени столбца для проверки, поэтому вы получите ActiveRecord::StatementInvalid.

...