Использование attr_accessor в Rails
Когда вы используете attr_reader
/attr_writer
/attr_accessor
в моделях Rails?
5 ответов
attr_accessor может использоваться для значений, которые вы не хотите напрямую хранить в базе данных, и которые будут существовать только в течение всего срока службы объекта (например, пароли).
attr_reader может использоваться как одна из нескольких альтернатив для выполнения чего-то подобного:
def instance_value
"my value"
end
Никогда, если у вас нет особой необходимости в этом. Автоматические средства доступа к базе данных созданы для вас, так что вам не о чем беспокоиться.
любой attr_accessor
Если вы создадите, изменится @attr
на объекте rails, но он будет потерян при уничтожении объекта, если вы не вернете его обратно в базу данных. Иногда вам нужно такое поведение, но это необычно в приложении rails.
Теперь в ruby, это другая история, и вы используете их очень часто. Но я был бы удивлен, если они понадобятся вам в рельсах - особенно на начальном этапе.
Модели Rails - это просто рубиновые классы, которые наследуются от ActiveRecord::Base
, ActiveRecord использует attr_accessor
s, чтобы определить методы получения и установки для имен столбцов, которые ссылаются на таблицу класса ruby. Важно отметить, что это только для настойчивости; модели все еще только рубиновые классы.
attr_accessor :foo
это просто ярлык для следующего:
def foo=(var)
@foo = var
end
def foo
@foo
end
attr_reader :foo
это просто ярлык для следующего:
def foo
@foo
end
attr_writer :foo
это ярлык для следующего:
def foo=(var)
@foo = var
end
attr_accessor
это ярлык для геттера и сеттера в то время как attr_reader
это ярлык для геттера и attr_writer
это ярлык только для сеттера.
В рельсах ActiveRecord использует эти методы получения и установки удобным способом для чтения и записи значений в базу данных. НО, база данных - это просто слой постоянства. Вы должны быть свободны в использовании attr_accessor
а также attr_reader
как и любой другой класс ruby, чтобы правильно составить свою бизнес-логику. Поскольку вам нужно получить и установить атрибуты ваших объектов вне того, что вам нужно сохранить в базе данных, используйте attr_
с соответственно.
Больше информации:
http://apidock.com/ruby/Module/attr_accessor
Если вы используете его для проверки приемлемости term_of_service, вам следует рассмотреть возможность использования validates:terms_of_service,:accept => true. Это создаст виртуальный атрибут и будет гораздо более кратким.
http://guides.rubyonrails.org/active_record_validations.html.
Один из примеров - хранить несколько параметров в одном сериализованном столбце. Построитель форм будет жаловаться, если вы попытаетесь создать текстовое поле для одного из этих параметров. Вы можете использовать attr_accessor, чтобы подделать его, а затем в действии обновления сохранить его в столбце сериализации.