Переопределение метода 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.

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