在设置模型时,我经常发现自己必须在设置某些验证时写出所有属性。一个常见的例子是我使用presence
参数:
validates :first_name, :last_name, :username, :email, presence: true
是否有一种聪明的方法可以选择所有属性而无需将它们全部写出来,类似于如何在rails控制台中检索它们?
User.columns
并将其作为验证方法中的参数传递?
ALL_ATTRIBUTES = User.columns
validates ALL_ATTRIBUTES, presence: true
尝试这样的事情我得到了这个错误undefined method 'to_sym'
答案 0 :(得分:2)
我不会鼓励你或任何人这样做。原因是当你遇到问题时,当你的模型的一个对象没有得到保存并且由于在未来一段时间后添加到应用程序的新列而抛出错误,你或新开发人员会想知道为什么?!?!
但是,如果你必须这样做,你去:
validates *self.column_names.map(&:to_sym), presence: true
此处,Ruby中的*
称为splat operator和here's the explanation on &:。
答案 1 :(得分:1)
这是一个糟糕的主意。但你可以这样做:
attrs = column_names.map { |column| column.to_sym }
validates *attrs, presence: true
为什么这是一个坏主意?因为它不是很清楚什么是验证它。它使调试变得困难,并可能导致你有奇怪的错误。如果您将来添加一个不需要在线验证的列,您将会绊倒。此外,有些事情我不需要在场。例如,电子邮件字段将需要正则表达式验证,该验证会自动知道空字符串无效。因此,状态验证器是多余的。
要小心太聪明,因为它毕竟不是那么聪明。