如何拥有可维护的用户名黑名单

时间:2019-01-27 18:22:53

标签: ruby-on-rails ruby ruby-on-rails-5 blacklist

我的应用程序是一个社交平台,我希望支持团队能够维护昵称黑名单。因此,我有一个包含不同名称的模型黑名单。

现在,我尝试使用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 :(得分:0)

您不需要包装要在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来获取非重复值。

因此,您不需要执行uniqto_s步骤。最后一个,因为验证正在等待可枚举的对象,并且您将传递一个字符串。

类似的东西:

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

您在验证中使用的where无法正常工作,因为它正在应用WHERE语句而未传递要检查的列名,因此您将获得一个ActiveRecord::StatementInvalid