出于教育和实验的原因,我希望能够覆盖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中的东西?
答案 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