2016-05-12 5 views
1

Gibt es eine Option, den item_type für eine Version zu konfigurieren? Ich habe eine Klasse Post, und der Standardwert item_type wäre Post; Gibt es eine Option zu konfigurieren, dass Foo sein?Paper Trail Gem: Verwendung eines benutzerdefinierten item_type für bestimmtes Modell

UPDATE mit Beispiel:

class Post < ActiveRecord::Base 
    has_paper_trail 
end 

post = Post.create # this creates a new post along with a version. 
version = post.versions.first 
version.item_type = 'Post' # Item type here is the name of the base model 'Post'. 
+0

ich den Titel und nach aktualisiert. Es ist für den Papierpfad Juwel. –

Antwort

-1

Sie wollen die class_name Option. Dies sollte mit Ihrem Beispiel arbeitet:

class Post < ActiveRecord::Base 
    has_paper_trail :class_name => 'Foo' 
end 

Dies wird Version der Post Klasse als Foo.

Weitere Informationen finden Sie in der Dokumentation Paper Trail im Bereich Custom Version Classes.

+0

@HaiNguyen Hat dies Ihre Frage beantwortet? Wenn ja, klicke bitte auf das Häkchen neben der Antwort, um es zu akzeptieren. Das Häkchen wird grün. Upvotes sind auch immer willkommen! –

+0

Die Frage des OP war über die Datenbankspalte 'versions.item_type'.Die Übergabe von ': class_name' an' has_paper_trail' sollte keinen Einfluss auf diese Datenbankspalte haben. –

0

Gibt es eine Option, um den item_type für eine Version zu konfigurieren? Ich habe eine Klasse Post, und der Standardwert item_type wäre Post; Gibt es eine Möglichkeit, das Foo zu konfigurieren?

Nr Wenn Sie has_paper_trail nennen, fügt es eine polymorphe Vereinigung namens item. Daher PaperTrail steuert nicht die Datenbankspalte item_type, ActiveRecord tut.

Hier ist die Definition des has_many Vereins:

has_many(
    versions_association_name, # Usually "versions" 
    -> { order(model.timestamp_sort_order) }, # Usually "created_at" 
    class_name: version_class_name, # Usually "PaperTrail::Version" 
    as: :item # Specifies a polymorphic interface 
) 
0

Nur über diese gestolpert, erkennen seine ein bisschen alt jetzt aber dachte, ich meine Lösung teilen würde, wie ich die gleiche Forderung hatte. Dies ist nur eine Teillösung, aber es funktioniert mich

ich die PaperTrail Version Klasse erweitert und außer Kraft gesetzt, die item_type Getter

class AuditTrail < PaperTrail::Version 
xss_foliate :except => [:object, :object_changes] 

    def item_type 
     if(self[:item_type] == "SomethingIWantToChange") 
      return "Different String" 
     end 

     return self[:item_type] 
    end 
end 

Ich habe dann jedes meiner Modelle setzen diese Klasse zu verwenden, etwa so:

has_paper_trail :class_name => 'AuditTrail' 

Dann kann ich die Versionen Tabelle abfragen und zurückgegebenen Objekte wird durch das überschriebene Getter laufen und die item_type wird, als ich brauche:

audit_records = AuditTrail.where(someproperty: "something") 

So ist dies nicht tatsächlich in der DB ändern, wenn es geschrieben wird, aber es ist der beste Weg, ich es anders zu meinem Frontend finden konnte

Hinweis präsentieren, dass es nicht die item_type wenn Sie nicht ändert holen Versionen ohne eine Abfrage vom erweiterten Objekt dh mit:

Someobject.find(1).versions.last 

^dies gibt immer noch die item_type von der DB