Переопределяющие методы в ActiveRecord :: QueryMethods - PullRequest
3 голосов
/ 08 апреля 2011

Я хочу иметь возможность переопределить определенные методы в ActiveRecord :: QueryMethods для образовательных и экспериментальных целей.

Пример. Пользователь - это класс ActiveRecord, включающий модули, которые перезаписывают «порядок» QueryMethod:

User.where("last_logged_in_at < ?", 1.year.ago).order("my own kind of arguments here")

Однако я не могу заставить вещи работать. Какой модуль я должен переопределить? Что-то в жемчужине ARel, AR :: Relation или AR :: QueryMethods?

1 Ответ

3 голосов
/ 16 июня 2011

Я думаю, что ответ заключается в том, чтобы отследить, где определен существующий Арел 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
...