Почему вы не можете напрямую обновить результат поиска Active Record? - PullRequest
1 голос
/ 13 марта 2019

Обновление результата активной записи find работает, как и ожидалось, когда вы присваиваете его переменной:

user = User.find(1790)
user.archived          # => true
user.archived = false
user.save              # => true
user.archived          # => false

Почему вы не можете обновить результат find напрямую?

User.find(1790).archived          # => true
User.find(1790).archived = false
User.find(1790).save              # => true
User.find(1790).archived          # => true

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Каждый раз, когда вы делаете find, вы получаете новый экземпляр User на основе текущих значений в таблице users.Итак, когда вы User.find(1790).save, экземпляр User больше не имеет .archived = false, потому что вы только что извлекли запись из базы данных (выполнив User.find), которая имеет archived = true.

Try:

User.find(1790).archived          # => true
User.find(1790).archived = false
User.find(1790).changed?          # => false
User.find(1790).save              # => true
User.find(1790).archived          # => true

Но посмотрите, что произойдет, когда вы это сделаете:

User.find(1790).archived                # => true
User.find(1790).update(archived: false) # => true
User.find(1790).archived                # => false
0 голосов
/ 13 марта 2019

User.find(1790) - Как видно из названия метода, это finds record matching given conditions.Это запускает запрос и получает запись каждый раз.Следовательно, установка значений в этом утверждении не отражает, так как это set locally только для этого утверждения.Когда вы снова вызываете User.find(1790).save ранее установленное значение не сохраняется, и запрос на поиск выполняется снова.

Принимая во внимание, что когда вы присваиваете результат переменной, вы можете изменить значение переменной и сохранить его, что затемобновляет активную запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...