2014-01-26 12 views
10

Ich versuche, ein Rails-Plugin zu erstellen. In den meisten Fällen funktioniert das, was ich geschrieben habe. Es gibt jedoch ein Problem mit Assoziationen. Wenn ich versuche, eine Verbindung zu nennen, ich diesen Fehler:ActiveRecord :: Base gehört nicht in eine Hierarchie von ActiveRecord absteigend

ActiveRecord::Base doesn't belong in a hierarchy descending from ActiveRecord 

Im Moment sieht das Plugin wie folgt aus:

module ControlledVersioning 
    module ActsAsVersionable 
    extend ActiveSupport::Concern 

    included do 
     has_many :versions, as: :versionable 

     after_create :create_initial_version 
    end 

    module ClassMethods 
     def acts_as_versionable(options = {}) 

     cattr_accessor :versionable_attributes 
     self.versionable_attributes = options[:versionable_attributes] 
     end 
    end 

    private 
    def create_initial_version 
     version = versions.create 
    end 
    end 
end 

ActiveRecord::Base.send :include, ControlledVersioning::ActsAsVersionable 

Auch hier wird die Fehlermeldung ausgelöst, wenn ich versuche, das nennen Verband. Ich verwendete Debugger im after_create Callback und versuchte ausgeführt wird:

> versions.create 
*** ActiveRecord::Base doesn't belong in a hierarchy descending from ActiveRecord 

> versions 
*** ActiveRecord::Base doesn't belong in a hierarchy descending from ActiveRecord 

> Version.new 
#<Version id: nil, versionable_id: nil, versionable_type: nil> 
+0

Sie könnten diese Antwort nützlich finden, lesen Sie auch die Kommentare auf der Antwort http://stackoverflow.com/questions/20824470/adding-scope-to-actrecord-causes-hierarchy-error – jamesc

+0

Nicht sicher, dass das in diesem Fall gilt . Da es sich um ein Plugin handelt, kann ich die Bedenken nicht direkt in die Modelle aufnehmen. Ich verwende das gleiche Format, das von den Rails Guides empfohlen wird, wie Sie [hier] (http://guides.rubyonrails.org/plugins.html#add-an-instance-method) sehen können. Sie verwenden Bedenken in einem Plugin und es scheint in ihrem Fall gut zu funktionieren. – nullnullnull

+1

Entschieden, um zu sehen, wie [Büroklammer] (https://github.com/airbla/de/paper_trail/blob/master/lib/paper_trail/has_paper_trail.rb) Dinge gehandhabt hat. Anstatt ein Anliegen zu verwenden, enthalten sie alle Zuordnungen und Rückrufe innerhalb der 'has_paper_trail'-Funktion. Folgte Anzug mit meinem Plugin und alles hat gut funktioniert. – nullnullnull

Antwort

0

Ich würde versuchen, aktiven Datensatz in einem initializer erstreckt, anstatt es zu einschließlich.

initializers/acts_as_versionable.rb ActiveRecord::Base.extend(ControlledVersioning::ActsAsVersionable)

Ebenfalls in der Entwicklung; oder jede Umgebung, die die Dateien neu lädt, wird wahrscheinlich ein Fehler wie has been removed from the module tree but is still active angezeigt. Stellen Sie sicher, dass sich die Plugin-Datei in config.ager_load_paths befindet und nicht in einem Konfliktpfad.

Verwandte Themen