Мне нужно переопределить метод рельсов (активная запись) update_all
, чтобы он всегда обновлял поле updated_at
. Как мне добиться этого?Переопределить рельсы метод update_all
ответ
Поместите следующий код в файле /config/initializers/update_all_with_touch.rb
class ActiveRecord::Relation
def update_all_with_touch(updates, conditions = nil, options = {})
now = Time.now
# Inject the 'updated_at' column into the updates
case updates
when Hash; updates.merge!(updated_at: now)
when String; updates += ", updated_at = '#{now.to_s(:db)}'"
when Array; updates[0] += ', updated_at = ?'; updates << now
end
update_all_without_touch(updates, conditions, options)
end
alias_method_chain :update_all, :touch
end
Он автоматически добавляет параметр :updated_at => Time.now
всякий раз, когда вы используете update_all
.
Объяснение:
Это использование сниппет alias_method_chain
переопределить значение по умолчанию update_all
:
alias_method_chain :update_all, :touch
Метод update_all
заменяется методом update_all_with_touch
я определил, и оригинальный update_all
переименовывается update_all_without_touch
. Новый метод изменяет объект upgrades
, чтобы ввести обновление updated_at
, а затем вызвать оригинал update_all
.
Вы можете переопределить метод update_all в модели:
def self.update_all(attr_hash) # override method
attr_hash[:updated_at] = Time.now.utc
super(attr_hash)
end
Мне нужно это поведение более чем в одной модели, и, следовательно, я искал метод, который будет работать в разных моделях. –
Итак, добавьте суперкласс класса ActiveRecord и добавьте туда функцию. Он будет доступен для всех ваших моделей. – user2503775
- 1. Переопределить метод (обезьяны патч?) На рельсы ядра
- 2. Рельсы, переопределение метод ассоциации
- 3. Невозможно переопределить/обезьяна патч метод рельсы с рельсами 3.1.3
- 4. Переопределить метод «+»
- 5. Переопределить метод
- 6. Переопределить метод
- 7. переопределить метод
- 8. Рельсы 3.2. Переопределить validates_presence_of поведения
- 9. Обновление метки времени с #update_all
- 10. переопределить PrincipalPermissionAttribute SecurityAction.Demand метод
- 11. Как переопределить метод?
- 12. переопределить метод прототипа даты
- 13. переопределить виртуальный метод C++
- 14. Переопределить метод java.io.FileOutputStream
- 15. Swift переопределить метод сделалPressSend
- 16. Java - переопределить внешний метод
- 17. Переопределить метод RedirecToAction
- 18. Переопределить метод обновления UpdateAPIView
- 19. Переопределить метод setText UILabel?
- 20. переопределить метод initComponent()
- 21. Как переопределить метод расширения?
- 22. Как переопределить метод OnDraw?
- 23. Переопределить метод сериализации XML
- 24. метод равен - как переопределить
- 25. Переопределить метод ListView Clear()
- 26. Невозможно переопределить onMeasure метод
- 27. Где переопределить метод shouldStartLoadWithRequest?
- 28. Переопределить общий метод
- 29. Как переопределить метод
- 30. Переопределить метод .ToString C#
Это решение работает, однако я не понимаю, как именно это работает. Каковы методы update_all_without_updated_at или update_all_with_updated_at? Кроме того, в коде использовались разные форматы update_all, и поскольку такие обновления могут быть хешем или массивом или строкой. Я могу проверить тип и объединить параметр updated_at для хэша, и это работает, но как насчет того, когда его массив или строка? –
@ user523146 Я изменил фрагмент, чтобы обрабатывать String и Arrays, и добавил некоторые объяснения. Обновите файл и перезапустите сервер, чтобы просмотреть изменения. – Baldrick
Я заменил 'with_updated_at' на' with_touch' для уточнения. – Baldrick