Метод сохранения Rails, если без изменений

Кажется, я помню, что где-то читал, что rails не будет фиксироваться в базе данных, если никакие атрибуты не были изменены (предположительно, как часть грязной активной записи), так ли это? Кажется, я не могу его найти, и я не мудрее, если бы быстро просмотрел исходный код.

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

Я предполагаю, что after_save с грязными данными не будет работать??

1 ответ

Решение

Rails не будет делать UPDATE но это будет работать after_save обратные вызовы, даже если ничего не изменилось:

pry $ u = User.first
=> #<User id: 1, email: "dave@davebryand.com", username: "dbryand"...
pry $ u.updated_at
=> Tue, 24 Jun 2014 18:36:04 UTC +00:00
pry $ u.changed?
=> false
pry $ u.save
From: /Users/dave/Projects/sample/app/models/user.rb @ line 3 :

    1: class User < ActiveRecord::Base
    2:
 => 3:   after_save -> { binding.pry }

pry $ exit
=> true
pry $ u.updated_at
=> Tue, 24 Jun 2014 18:36:04 UTC +00:00

Если вы хотите сделать что-то зависящее от изменений определенного атрибута в before_save, просто делать:

pry $ u = User.first
=> #<User id: 1, email: "dave@davebryand.com", username: "dbryand"...
pry $ u.save
=> true
pry $ u.name = "John Doe"
=> "John Doe"
pry $ u.save
From: /Users/dave/Projects/sample/app/models/user.rb @ line 3 :

    1: class User < ActiveRecord::Base
    2:
 => 3:   before_save -> { binding.pry if name_changed? }

Грязные документы здесь: http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

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