ruby-on-rails 如何在保存到rails框架之前通过循环剥离Active record中的列值?

nmpmafwu  于 2023-02-26  发布在  Ruby
关注(0)|答案(2)|浏览(117)

在保存到数据库之前,我必须为每条记录删除空格。我可以通过为每列指定空格来做到这一点,但当每条记录中有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
ni65a41a

ni65a41a1#

我将使用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
jjjwad0x

jjjwad0x2#

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

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

现在你可以用一个循环在每一列上应用strip

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

希望能有所帮助

相关问题