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
в случае вышеупомянутого метода getter, потому что метод просто возвращает последнее выражение в методе (@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