Точка доступа ActiveRecord (.) Против скобки ([])
С Active Record мы можем получить доступ к значению, как
метод доступа
user = User.find(1)
user.name #=> 'John'
или же
хэш-доступ
user[:name] #=> 'John'
Мне просто интересно, когда использовать какой, или есть какая-нибудь лучшая практика там? Лично я бы предпочел method access
потому что я чувствую, что это больше похоже на рубин. Однако когда я вижу код от других, я сталкиваюсь с hash access
,
2 ответа
Соглашение Rails заключается в использовании ActiveRecord:: AttributeMethods:: Read #read_attribute
(точечная запись), а не псевдоним ActiveRecord:: AttributeMethods #[]
, который:
Возвращает значение атрибута, обозначенного
attr_name
после того, как это было Typecast (например,“2004-12-12”
в столбце даты приведен к объекту даты, какDate.new(2004, 12, 12)
). Это поднимаетActiveModel::MissingAttributeError
если указанный атрибут отсутствует.
Я настоятельно рекомендую не использовать скобочные обозначения, так как это нарушает иерархию наследования вызовов методов и усложняет рефакторинг.
Если моя модель имеет атрибут name
и я решаю, что хочу улучшать имя каждый раз, когда кто-то его читает, очень идиотский способ сделать это:
def name
"Awesome #{super}!"
end
Любое место в моем приложении, которое использует версию метода, будет работать нормально, любое место, которое использует []
нотация вернет необработанные данные базы данных. Я мог бы перезаписать []
но тогда мне понадобится проверка особых условий для определенных атрибутов. Все это было бы кошмаром.
Другой сценарий, скажем, у меня был атрибут, который раньше хранился в базе данных, но через некоторое время решил, что он должен быть вычислен на лету, и в итоге отбросил столбец базы данных. С версией метода все, что мне нужно сделать, это добавить методы к моей модели. С []
нотации процесс будет намного сложнее.
Также []
обеспечивает незначительное улучшение производительности, поэтому, похоже, что оно "ближе" к необработанным данным, на самом деле это не так.