Могу ли я реализовать rails setter и getter для атрибутов для столбцов БД - PullRequest
3 голосов
/ 15 декабря 2009

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

def name
  "sir" + name
end

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

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

Ответы [ 3 ]

8 голосов
/ 15 декабря 2009
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

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

2 голосов
/ 15 декабря 2009

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

def name
  "sir" + self[:name]
end
0 голосов
/ 20 марта 2015

Использование super

Методы переопределения Ruby

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

def name
  "sir #{super}"
end
...