3

教育的および実験的な理由から、ActiveRecord::QueryMethods の特定のメソッドをオーバーライドできるようにしたいと考えています。

例: User は、QueryMethod "order" を上書きするモジュールを含む ActiveRecord クラスです。

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 に答える