Был ли self.column = значение для обновления устарело в Rails? - PullRequest
0 голосов
/ 25 января 2020

Я просто пытался использовать

self.name = 'Tom'

внутри моей модели пользователя, но столбец не обновляется.

Использование

self.update_column(:name, 'Tom')

и

update_column(:name, 'Tom')

работает.

Не признан ли первый способ изменения значения устаревшим?

Ответы [ 2 ]

2 голосов
/ 25 января 2020

self - это объект, когда вы делаете self.name = 'Tom', он просто устанавливает новое значение в атрибуте на уровне объекта, но чтобы сохранить его в базе данных, вам нужно вызвать метод save для self после установка значения.

self.name = 'Tom'
self.save!

Попробуйте!

1 голос
/ 27 января 2020
self.name = 'Tom'

Вызывает метод установки name=, который ActiveRecord генерирует из ваших столбцов. Это просто обновляет объект в памяти и помечает атрибут как измененный, поэтому при вызове .save или .save! изменения сохраняются в базе данных.

Был ли устаревшим первый способ изменения значения ?

Нет. Вы просто совершенно не поняли, что он делает. Использование сеттеров никогда не вызывало автоматического обновления базы данных. Это было бы действительно неожиданным поведением.

self.update_column(:name, 'Tom') и update_column(:name, 'Tom') на самом деле одно и то же. У первого просто есть явный получатель, а у последнего неявный. Но в обоих случаях получатель self. Как и его старший брат, метод #update создает запрос UPDATE sql.

...