【问题标题】:Overriding methods in ActiveRecord::QueryMethods覆盖 ActiveRecord::QueryMethods 中的方法
【发布时间】:2011-04-08 03:44:56
【问题描述】:

出于教育和实验的原因,我希望能够覆盖 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 中的某些内容?

【问题讨论】:

    标签: ruby activerecord arel


    【解决方案1】:

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

    【讨论】:

    • 是的,你是对的。想到如果我覆盖它会破坏的所有东西,我感到头晕目眩,所以我最终也制作了一个my_order 方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2014-03-17
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多