Как высушить повторяющийся код Ruby?

Я относительно новичок в рубине. Можно ли это высушить? И как?

def primary_phone
  number_to_phone self.primary_phone_number
end

def primary_phone=(number)
  self.primary_phone_number = number.gsub(/\D/, '')
end

def secondary_phone
  number_to_phone self.secondary_phone_number
end

def secondary_phone=(number)
  self.secondary_phone_number = number.gsub(/\D/, '')
end

def fax
  number_to_phone self.fax_phone_number
end

def fax=(number)
  self.fax_phone_number = number.gsub(/\D/, '')
end

Я использую этот код в Rails как своего рода буфер между базой данных, которая хранит числа как целые числа, и пользовательской формой, которая вводит их как строки.


person Dylan Karr    schedule 29.08.2013    source источник
comment
Похоже, вам нужно определить пользовательский тип данных. Я не делал этого в ActiveRecord, который, я полагаю, вы используете для своих моделей данных?   -  person Neil Slater    schedule 29.08.2013
comment
Да, я использую ActiveRecord. Как вы создаете пользовательские типы данных? Знаете какие-нибудь хорошие ссылки или я где-то ищу какую-то документацию?   -  person Dylan Karr    schedule 29.08.2013
comment
Я погуглил, и я не уверен, что пользовательские типы данных - это то, что я ищу. Кажется, это перебор. Я просто хочу получить и установить целые числа в специальном формате, который уже наполовину поддерживается рельсами.   -  person Dylan Karr    schedule 29.08.2013


Ответы (1)


Все, что тебе нужно,

before_save :sanitize_phone_number_fields

def sanitize_phone_number_fields
  [:primary_phone, :secondary_phone, :fax].each{|attr| self.send(attr).gsub!(/\D/, '')}
end
person usha    schedule 29.08.2013
comment
Блин, именно то, что мне было нужно! Спасибо. - person Dylan Karr; 29.08.2013
comment
Используйте здесь .each, а не .map. Вы просто повторяете, а не пытаетесь создать новую версию массива. - person nzifnab; 24.10.2013