Использование 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_accessors, чтобы определить методы получения и установки для имен столбцов, которые ссылаются на таблицу класса 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

http://www.rubyist.net/~slagell/ruby/accessors.html

Что такое attr_accessor в Ruby?

Если вы используете его для проверки приемлемости term_of_service, вам следует рассмотреть возможность использования validates:terms_of_service,:accept => true. Это создаст виртуальный атрибут и будет гораздо более кратким.

http://guides.rubyonrails.org/active_record_validations.html.

Один из примеров - хранить несколько параметров в одном сериализованном столбце. Построитель форм будет жаловаться, если вы попытаетесь создать текстовое поле для одного из этих параметров. Вы можете использовать attr_accessor, чтобы подделать его, а затем в действии обновления сохранить его в столбце сериализации.

Другие вопросы по тегам