在 rails 框架中保存之前,如何通过循环去除活动记录中的列值?

How to strip column values in Active record through loop before saving in rails framework?

在保存到数据库之前,我必须删除每条记录的空格。 我可以通过为每一列指定它来做到这一点,但是当每条记录中有 100 列时,这很痛苦,而且代码行数不会大大增加。

需要帮助将代码更改为循环,但作为业余爱好者 rails 我无法完成它。

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

您可以获取字符串类型的所有列名:

list = Model.columns.select { |x| x.name if x.type == :string }.map(&:name)

现在您可以通过循环在每一列上应用条带

list.each { |x| self.send(x.to_sym)&.strip! }

希望对您有所帮助

我会 attributes.each 迭代所有属性名称和当前实例的值(同时忽略属性名称)。对于每个值,我会调用 try(:strip!) 从值中去除空格。请注意 try 仅在实际 respond_to strip 的值上调用 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