覆盖特定型号的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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新