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

StackOverflow https://stackoverflow.com/questions/1906702

  •  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

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

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

def name
  "sir #{super}"
end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top