在保存到Rails框架中之前,如何通过循环剥离Active Record中的列值?

时间:2018-11-03 17:25:49

标签: ruby-on-rails ruby loops ruby-on-rails-3 rails-activerecord

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

2 个答案:

答案 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! }

希望有帮助