Ответ 1
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