Могу ли я реализовать метод установки и получения рельсов для атрибутов для столбцов БД?
-
19-09-2019 - |
Вопрос
В рельсах мы можем получить доступ к столбцу базы данных через предоставленные рельсы атрибуты, но можем ли мы это изменить?например, у меня есть база данных со столбцом имени, могу ли я реализовать что-то вроде.
def name
"sir" + name
end
Я попробовал, но это привело к переполнению стека.Есть способ добиться этого.
еще вопрос: есть ли разница между именем и self.name.
Решение
def name
"sir" + read_attribute(:name)
end
Но избегайте этой практики.Вместо этого используйте дополнительный метод получения/установки, также известный как «виртуальный атрибут».Для получения дополнительной информации прочитайте этот ответ: оформление атрибута в рельсах
В вашем случае также есть странный побочный эффект.При каждом обращении к атрибуту к нему добавляется имя.После 3 звонков вы получите
"sir sir sir name"
Действительно, вы можете сделать
def name
n = read_attribute(:name)
if /^sir/.match(name)
n
else
"sir #{n}"
end
end
но, серьёзно, не делай этого.
Другие советы
Если вы осведомлены о возможных осложнениях, но все же необходимо это сделать, то:
def name
"sir" + self[:name]
end
Использовать super
Здесь много объяснений, но я думаю, что это так же просто, как вызов уже определенного метода.
def name
"sir #{super}"
end