3

出于教育和实验的原因,我希望能够覆盖 ActiveRecord::QueryMethods 中的某些方法。

示例:User 是一个 ActiveRecord 类,其中包括覆盖 QueryMethod“订单”的模块:

User.where("last_logged_in_at < ?", 1.year.ago).order("my own kind of arguments here")

但是,我似乎无法让事情正常进行。我应该覆盖什么模块?ARel gem、AR::Relation 或 AR::QueryMethods 中有什么东西?

4

1 回答 1

3

我认为答案是追踪现有 Arelorder的定义位置。

module ActiveRecord
  module QueryMethods
    def order(*args)
      relation = clone
      relation.order_values += args.flatten unless args.blank?
      relation
    end
  end
end

控制台中的快速测试验证更改是否有效

module ActiveRecord::QueryMethods
  def order(*args)
    relation = clone
    if args.first
      puts "ordering in ascending id"
      relation.order_values += ["id ASC"]
    else
      puts "ordering in descending id"
      relation.order_values += ["id DESC"]
    end
    relation
  end
end

所以,你可以做这样的事情。

但我的建议是创建一个my_order保持order原样不变的自定义,但封装了相同的逻辑。

但是您可以直接在活动记录上定义

class ActiveRecord::Base
  class << self
    def my_order(*args)
      self.order(*my logic for ordering*)
    end
  end
end
于 2011-06-16T05:23:33.743 回答