在保存到数据库之前,我必须删除每个记录的空间。 我可以通过为每列指定它来做到这一点,但是当每条记录中有100列时,这很痛苦,并且没有代码行会大大增加。
需要将代码更改为循环的帮助,但是作为一名业余爱好者,我无法完成它。
class hello < ActiveRecord::Base
before_validation :remove_spaces
def remove_spaces
self.login = self.login.strip if self.login.present?
self.email = self.email.strip if self.email.present?
. so on .......
end
end
答案 0 :(得分:3)
我将attributes.each
遍历所有属性名称和当前实例的值(而忽略属性名称)。对于每个值,我将调用try(:strip!)
从值中去除空格。请注意,try
仅对实际上为strip!
respond_to
的值(实际上基本上只是字符串)调用strip
,因此它将忽略nil
值或不支持的类型-例如时间戳或布尔值。
before_validation :sanitize_strings
private
def sanitize_strings
attributes.each { |_, value| value.try(:strip!) }
end
或者,当您只想清理特定属性时,可以遍历它们的名称:
ATTRIBUTES_TO_SANITIZE = %i[name title description]
def sanitize_strings
ATTRIBUTES_TO_SANITIZE.each { |attr| send(attr).try(:strip!) }
end
答案 1 :(得分:0)
您可以将字符串类型的所有列名称获取为:
list = Model.columns.select { |x| x.name if x.type == :string }.map(&:name)
现在您可以使用循环在每个列上应用条带
list.each { |x| self.send(x.to_sym)&.strip! }
希望有帮助