我的应用程序是一个社交平台,我希望支持团队能够维护昵称黑名单。因此,我有一个包含不同名称的模型黑名单。
现在,我尝试使用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"
答案 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来获取非重复值。
因此,您不需要执行uniq
和to_s
步骤。最后一个,因为验证正在等待可枚举的对象,并且您将传递一个字符串。
类似的东西:
validates_exclusion_of :nickname,
in: Blacklist.distinct.pluck(:name),
message: 'This nickname is not allowed'
您在验证中使用的where
无法正常工作,因为它正在应用WHERE语句而未传递要检查的列名,因此您将获得一个ActiveRecord::StatementInvalid
。