Когда вы используете attr_reader
/attr_writer
/attr_accessor
в моделях Rails?
Использование attr_accessor в Rails
Ответ 1
attr_accessor может использоваться для значений, которые вы не хотите хранить в базе данных напрямую, и которые будут существовать только для жизни объекта (например, паролей).
attr_reader может использоваться как одна из нескольких альтернатив для выполнения примерно так:
def instance_value
"my value"
end
Ответ 2
Никогда, если у вас нет конкретной необходимости. Для вас созданы автоматические средства доступа к базе данных, поэтому вам не нужно беспокоиться.
Любой attr_accessor
, который вы создаете, изменит соответствующий объект @attr
на объект rails, но он будет потерян, когда объект будет уничтожен, если вы не вернете его в базу данных. Иногда вам действительно нужно это поведение, но это необычно в приложении rails.
Теперь в рубине это совсем другая история, и вы в конечном итоге используете их очень часто. Но я был бы удивлен, если бы вы нуждались в них в рельсах - особенно изначально.
Ответ 3
Модели Rails - это только рубиновые классы, которые наследуют от ActiveRecord::Base
. ActiveRecord использует attr_accessor
для определения геттеров и сеттеров для имен столбцов, которые относятся к таблице классов 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
Ответ 4
Если вы используете его для подтверждения принятия условий terms_of_service, вы должны действительно рассмотреть возможность использования validates: terms_of_service,: принятие = > true. Он создаст виртуальный атрибут и будет гораздо более кратким.
http://guides.rubyonrails.org/active_record_validations.html#acceptance.
Ответ 5
Одним из примеров является наличие нескольких параметров, хранящихся в одном сериализованном столбце. Конструктор форм будет жаловаться, если вы попытаетесь создать текстовое поле для одного из этих параметров. Вы можете использовать attr_accessor для подделки, а затем в действии обновления сохранить его в сериализованном столбце.