Могу ли я реализовать установщик и получатель рельсов для атрибутов для столбцов БД

В rails мы можем получить доступ к столбцу db через предоставленные атрибуты rails, но можем ли мы это изменить? например, у меня есть БД со столбцом имени, могу ли я реализовать что-то вроде.

def name
  "sir" + name
end

Я пробовал, но это приводит к переполнению стека. Есть способ сделать это.

еще вопрос, есть ли разница между name и self.name.


person sarunw    schedule 15.12.2009    source источник
comment
В результате действительно получился StackOverflow.   -  person Parziphal    schedule 02.04.2013


Ответы (3)


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

а если серьезно, то не делайте этого.

person Simone Carletti    schedule 15.12.2009
comment
Я согласен с тем, что добавление метода formatted_name — это путь, по ссылке. Не связывайтесь с именем атрибута, оно того не стоит. - person MattMcKnight; 15.12.2009

Если вы знаете о возможных осложнениях, но все же должны это сделать, то:

def name
  "sir" + self[:name]
end
person Jeff Schuil    schedule 15.12.2009
comment
это просто сокращение, см. Перезапись методов доступа по умолчанию на api.rubyonrails.org/classes/ActiveRecord /Base.html - person Jeff Schuil; 16.12.2009

Используйте 1_

Переопределение методов Ruby

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

def name
  "sir #{super}"
end
person jmjm    schedule 20.03.2015