0

我需要覆盖 rails update_all 方法,以便更新特定模型的 updated_at 字段。

我在 app/config/initializer/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 方法的解决方案。
4

1 回答 1

-1

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

app/config/initializer/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 方法的默认行为。

于 2015-01-12T09:34:09.927 回答