Ich möchte eine Kopie eines Aktivaufzeichnungsdatensatzes erstellen und dabei ein einzelnes Feld ändern (zusätzlich zur ID ). Was ist der einfachste Weg, um dies zu erreichen?
Mir ist klar, dass ich einen neuen Datensatz erstellen und dann jedes der Felder durchlaufen kann, die die Daten Feld für Feld kopieren - aber ich dachte, es muss einen einfacheren Weg geben, dies zu tun ...
sowie:
@newrecord=Record.copy(:id) *perhaps?*
q = p.clone
und dannp == q
komme ichtrue
zurück. Auf der anderen Seite, wenn ich benutzeq = p.dup
, bekomme ichfalse
zurück , wenn ich sie vergleiche.new?
Methode funktioniert nicht.Abhängig von Ihren Anforderungen und Ihrem Programmierstil können Sie auch eine Kombination aus der neuen Methode der Klasse und dem Zusammenführen verwenden. In Ermangelung eines besseren einfaches Beispiel an , dass Sie eine Aufgabe für einen bestimmten Zeitpunkt geplant haben , und Sie wollen , dass es auf einen anderen Termin duplizieren. Die tatsächlichen Attribute der Aufgabe sind nicht wichtig, also:
wird eine neue Aufgabe mit erstellen
:id => nil
,:scheduled_on => some_new_date
und alle anderen Attribute der gleiche wie der ursprüngliche Aufgabe. Wenn Sie Task.new verwenden, müssen Sie save explizit aufrufen. Wenn Sie also möchten, dass es automatisch gespeichert wird, ändern Sie Task.new in Task.create.Frieden.
quelle
WARNING: Can't mass-assign protected attributes: id, due_date, created_at, updated_at
zurückgekehrtMöglicherweise gefällt Ihnen auch das Amöben-Juwel für ActiveRecord 3.2.
In Ihrem Fall möchten Sie wahrscheinlich die Verwendung der machen
nullify
,regex
oderprefix
Optionen , die in der Konfiguration DSL.Es unterstützt die einfache und automatische rekursive Vervielfältigung
has_one
,has_many
undhas_and_belongs_to_many
Vereinigungen, Feld Vorverarbeitung und eine hochflexible und leistungsstarke Konfiguration DSL , die sowohl auf das Modell angewandt werden können und im laufenden Betrieb .Schauen Sie sich unbedingt die Amöben-Dokumentation an, aber die Verwendung ist ziemlich einfach ...
gerade
oder hinzufügen
zu deiner Gemfile
Fügen Sie dann den Amöbenblock zu Ihrem Modell hinzu und führen Sie die
dup
Methode wie gewohnt ausSie können auch steuern, welche Felder auf verschiedene Weise kopiert werden. Wenn Sie jedoch verhindern möchten, dass Kommentare dupliziert werden, aber dieselben Tags beibehalten möchten, können Sie Folgendes tun:
Sie können Felder auch vorverarbeiten, um die Eindeutigkeit sowohl mit Präfixen und Suffixen als auch mit regulären Ausdrücken anzuzeigen. Darüber hinaus gibt es zahlreiche Optionen, mit denen Sie für Ihren Zweck am besten lesbar schreiben können:
Das rekursive Kopieren von Assoziationen ist einfach. Aktivieren Sie Amöben auch für untergeordnete Modelle
Die Konfiguration DSL bietet noch mehr Optionen. Lesen Sie daher unbedingt die Dokumentation.
Genießen! :) :)
quelle
.amoeba_dup
nicht nur.dup
. Ich habe versucht, diesen Code auszuführen, aber hier hat er nicht funktioniert.Verwenden Sie ActiveRecord :: Base # dup, wenn Sie die ID nicht kopieren möchten
quelle
.clone
Normalerweise kopiere ich einfach die Attribute und ändere alles, was ich ändern muss:
quelle
unknown attribute
Fehler mit einer Spalte aufgrund einer Spalte, die aufgrund einer has_many-Beziehung vorhanden ist. Gibt es einen Weg daran vorbei?User.create(old_user.attributes.merge({ login: "newlogin", id: nil }))
. Dadurch wird ein neuer Benutzer mit der richtigen eindeutigen ID gespeichert.Wenn Sie eine tiefe Kopie mit Assoziationen benötigen, empfehle ich das Juwel deep_cloneable .
quelle
In Rails 5 können Sie einfach ein doppeltes Objekt oder einen Datensatz wie diesen erstellen.
quelle
Der einfache Weg ist:
Oder
quelle
Hier ist ein Beispiel für das Überschreiben der ActiveRecord-
#dup
Methode zum Anpassen der Instanzduplizierung und zum Einbeziehen der Beziehungsduplizierung:Hinweis: Für diese Methode ist kein externes Juwel erforderlich, es ist jedoch eine neuere ActiveRecord-Version mit
#dup
implementierter Methode erforderlichquelle
Sie können auch das Juwel Acts_as_inheritable überprüfen .
"Acts As Inheritable" ist ein Ruby Gem, der speziell für Rails / ActiveRecord-Modelle geschrieben wurde. Es ist für die Verwendung mit der Self-Referential Association oder für ein Modell mit einem übergeordneten Element vorgesehen, das die vererbbaren Attribute gemeinsam nutzt . Auf diese Weise können Sie jedes Attribut oder erben Beziehung aus dem Elternmodell. "
Durch Hinzufügen
acts_as_inheritable
zu Ihren Modellen haben Sie Zugriff auf folgende Methoden:erben_attribute
erbe_relations
Hoffe das kann dir helfen.
quelle
Da es beim Duplizieren eines Modells mehr Logik geben könnte, würde ich vorschlagen, eine neue Klasse zu erstellen, in der Sie die gesamte erforderliche Logik verarbeiten. Um das zu erleichtern, gibt es ein Juwel, das helfen kann: Clowne
Gemäß den Dokumentationsbeispielen für ein Benutzermodell:
Sie erstellen Ihre Cloner-Klasse:
und dann benutze es:
Beispiel aus dem Projekt kopiert, aber es gibt eine klare Vorstellung davon, was Sie erreichen können.
Für eine schnelle und einfache Aufzeichnung würde ich gehen mit:
Model.new(Model.last.attributes.reject {|k,_v| k.to_s == 'id'}
quelle