Вы должны быть в состоянии создать в модели притворный столбец, выполняя что-то вроде этого:
class Person < ActiveRecord::Base
def name
"#{self.first_name} #{self.surname}"
end
def name=(fullname)
first,last = fullname.split(' ') # or some smarter way to split
self.first_name = first
self.surname = last
end
end
Он должен быть доступен так же, как и любой другой столбец, и при попытке установить name
он просто вызовет методы установки для first_name
и surname
.
Если вы хотите сделать обратное, вы все равно можете использовать тот же трюк:
class Person < ActiveRecord::Base
def first_name
name.split(' ')[0]
end
def surname
name.split(' ')[1]
end
def first_name=(first)
name = [first, name.split(' ')[1]].join(' ')
end
def surname=(sname)
name = [name.split(' ')[0], sname].join(' ')
end
end
Единственное, что может быть плохим в этом - то, что манипулирование строками происходит один раз для каждого чтения и дважды для каждой записи.В качестве альтернативы вы можете перехватить что-то в контроллере, добавив что-то подобное для создания / обновления до @person.save
:
@person.name = [first_name, surname].join(' ')