Hacking ActiveRecord: Global benannten Bereich hinzufügen

Ich versuche, ein Paket allgemeiner Gültigkeitsbereiche für ActiveRecord-Modelle wie dieses zu haben:

module Scopes
  def self.included(base)
    base.class_eval do
      named_scope :not_older_than, lambda {|interval|
        {:conditions => ["#{table_name}.created_at >= ?", interval.ago]
      }
    end
  end
end
ActiveRecord::Base.send(:include, Scopes)

class User < ActiveRecord::Base
end

Wenn der benannte Bereich allgemein sein soll, müssen wir * table_name * angeben, um Namensprobleme zu vermeiden, wenn es sich um Joins handelt, die von einem anderen verketteten benannten Bereich stammen.

Das Problem ist, dass wir table_name nicht bekommen können, weil es auf ActiveRecord :: Base statt auf User aufgerufen wird.

User.not_older_than(1.week)

NoMethodError: undefined method `abstract_class?' for Object:Class
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2207:in `class_of_active_record_descendant'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1462:in `base_class'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1138:in `reset_table_name'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1134:in `table_name'
from /home/bogdan/makabu/railsware/startwire/repository/lib/core_ext/active_record/base.rb:15:in `included'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:92:in `call'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:92:in `named_scope'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:97:in `call'
from /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/named_scope.rb:97:in `not_older_than'

Wie kann ich den aktuellen Tabellennamen im Scopes-Modul abrufen?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage