我的应用程序是一个社交平台,我希望支持团队能够维护昵称黑名单。因此,我有一个包含不同名称的模型黑名单。
现在我尝试使用 validates_exclusion_of
将它们映射到 in:
但它引发了以下错误,
wrong number of arguments (given 1, expected 0)
validates_exclusion_of :nickname, in: -> {
where(Blacklist.select(:name).map(&:name).uniq.to_s)
}, message: "This nickname is not allowed"
最佳答案
您不需要将要排除的值包装在 lambda 中,如果您只传递 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#distinct获取非重复值。
这样你就不需要 uniq
和 to_s
这一步了。最后一个,因为验证正在等待可枚举对象,而您将传递一个字符串。
类似于:
validates_exclusion_of :nickname,
in: Blacklist.distinct.pluck(:name),
message: 'This nickname is not allowed'
您在验证中使用的 where
将不起作用,因为它应用 WHERE 语句而不传递要检查的列名,因此您将获得一个 ActiveRecord::语句无效
。
关于ruby-on-rails - 如何拥有可维护的用户名黑名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54391432/