attr_accessor
— это встроенный метод Ruby, не имеющий особого значения в контексте ActiveRecord. attr_accessor :tag_list
в основном эквивалентен этому коду:
# getter
def tag_list
@tag_list
end
# setter
def tag_list=(val)
@tag_list = val
end
Однако в моделях ActiveRecord может потребоваться что-то вроде этого:
def tag_list
self[:tag_list]
end
def tag_list=(val)
self[:tag_list] = val
end
Есть небольшая разница: в первом методе obj[:tag_list]
не использует то же хранилище, что и ваш геттер и сеттер. С последним так и есть.
Объяснение концепции геттера/сеттера
В Ruby следующие две строки кода эквивалентны
thing.blabla
thing.blabla()
Оба вызывают метод blabla
объекта thing
и оценивают последнее выражение, вычисленное в этом методе. Это означает, что вам также не нужен оператор return
в случае вышеуказанного метода получения, потому что метод просто возвращает последнее выражение в методе (@tag_list
, значение переменной экземпляра).
Кроме того, эти две строки кода эквивалентны:
thing.blabla=("abc")
thing.blabla = "abc"
Оба вызывают метод blabla=
объекта thing
. Специальное имя с символом =
можно использовать как любое другое имя метода.
Поскольку атрибуты, как их иногда называют, на самом деле являются простыми методами, вы также можете использовать некоторую специальную логику, преобразующую значения перед их возвратом или принятием. Пример:
def price_in_dollar
@price_in_euro * 0.78597815
end
def price_in_dollar=(val)
@price_in_euro = val / 0.78597815
end
person
Niklas B.
schedule
08.01.2012