覆盖特定模型Rails 4.2的update_all方法

时间:2015-01-12 09:23:41

标签: ruby-on-rails ruby update-all activerecord-relation

我需要覆盖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

我想将它用于特定型号,我该怎么做?

  • 在每个update_all中添加updated_at是其中一个解决方案,但我正在寻找一种可以覆盖update_all方法的解决方案。

1 个答案:

答案 0 :(得分:0)

将以下代码放在文件/config/initializers/update_all_with_touch.rb中 将此代码块放在

的应用程序/配置/初始化器/ 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方法的默认行为。