gpt4 book ai didi

ruby - 覆盖 ActiveRecord::QueryMethods 中的方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:49 24 4
gpt4 key购买 nike

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

最佳答案

我认为答案是追踪现有 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

关于ruby - 覆盖 ActiveRecord::QueryMethods 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5590191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com