Переопределение метода update_all для конкретных моделей Rails 4.2
Мне нужно переопределить метод rails update_all, чтобы он обновлял поле updated_at для определенных моделей.
Я добавил следующий модуль в app/config/intializer/xyzfile.rb:
module ActiveRecord
class Relation
def update_all_with_updated_at(updates)
case updates
when Hash
updates.reverse_merge!(updated_at: Time.now)
when String
updates += ", updated_at = '#{Time.now.to_s(:db)}'"
when Array
updates[0] += ', updated_at = ?'
updates << Time.now
end
update_all_without_updated_at(updates)
end
alias_method_chain :update_all, :updated_at
end
end
Я хочу использовать это для конкретных моделей, как я могу это сделать?
- Добавление updated_at в каждый update_all является одним из решений, но я ищу решение, с помощью которого я могу переопределить метод update_all.
1 ответ
Поместите следующий код в файл /config/initializers/update_all_with_touch.rb. Поместите этот блок кода в
приложение / Config / intializer / update_all_decorate.rb
class ActiveRecord::Relation
def update_all_decorate(updates, conditions = nil, options = {})
current_time = Time.now
# Inject the 'updated_at' column into the updates
case updates
when Hash; updates.merge!(updated_at: current_time)
when String; updates += ", updated_at = '#{current_time.to_s(:db)}'"
when Array; updates[0] += ', updated_at = ?'; updates << current_time
end
end
alias_method_chain :update_all, :touch
end
Блок alias_method_chain отвечает за переопределение поведения по умолчанию метода update_all.