Переопределение методов в ActiveRecord::QueryMethods

Я хочу иметь возможность переопределять определенные методы в 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?


person Ramon Tayag    schedule 08.04.2011    source источник


Ответы (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
person Matthew Rudy    schedule 16.06.2011
comment
Да, ты прав. У меня закружилась голова, когда я подумал обо всех вещах, которые я сломаю, если переопределю его, поэтому в итоге я тоже сделал метод my_order. Спасибо! - person Ramon Tayag; 17.06.2011