覆盖ActiveRecord :: QueryMethods中的方法

时间:2011-04-08 03:44:56

标签: ruby activerecord arel

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

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

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

然而,我似乎无法让事情发挥作用。我应该覆盖哪个模块? ARel gem,AR :: Relation或AR :: QueryMethods中的东西?

1 个答案:

答案 0 :(得分:3)

我认为答案是追踪现有Arel order的定义。

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