Точка доступа 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

Любое место в моем приложении, которое использует версию метода, будет работать нормально, любое место, которое использует [] нотация вернет необработанные данные базы данных. Я мог бы перезаписать [] но тогда мне понадобится проверка особых условий для определенных атрибутов. Все это было бы кошмаром.

Другой сценарий, скажем, у меня был атрибут, который раньше хранился в базе данных, но через некоторое время решил, что он должен быть вычислен на лету, и в итоге отбросил столбец базы данных. С версией метода все, что мне нужно сделать, это добавить методы к моей модели. С [] нотации процесс будет намного сложнее.

Также [] обеспечивает незначительное улучшение производительности, поэтому, похоже, что оно "ближе" к необработанным данным, на самом деле это не так.

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