Как зачистить значения столбцов в Active record через цикл перед сохранением в rails framework? - PullRequest
0 голосов
/ 03 ноября 2018

Я должен удалить пробелы для каждой записи перед сохранением в базу данных. Я могу сделать это, указав его для каждого столбца, но, когда в каждой записи по 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 голосов
/ 03 ноября 2018

Я бы хотел 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
0 голосов
/ 03 ноября 2018

Вы можете получить все имена столбцов типа string как:

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

Теперь вы можете применять полосу к каждому столбцу с помощью петли

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

Надеюсь, это поможет

...