2010-10-25 2 views
7

Mögliche Duplizieren Aufruf:
How can I avoid running ActiveRecord callbacks?Speichern active_record ohne Rückrufe in rails3

In Schienen 2 gab es eine private Methode auf active_records genannt create_without_callbacks, die man nennen könnte einen Datensatz in die retten Datenbank, ohne die mit diesem Objekt verbundenen Rückrufe auszulösen. Diese Methode ist in den Schienen 3 verschwunden. Gibt es eine Möglichkeit, dasselbe zu erreichen?

+1

Diese Frage heißt es ausdrücklich, Rails 3. Die angebliche doppelte geschrieben wurde zurück in Rails 2 Tage, jetzt Schienen 4 Info enthält, spricht jedoch nicht speziell Datensätze in Rails zu schaffen 3 (enthält jedoch Informationen zum Aktualisieren vorhandener Datensätze in Rails 3). Diese Frage ist meiner Meinung nach getrennt und eindeutig und kein Duplikat. – IAmNaN

Antwort

2

Sie verhindern, dass bestimmte Geschäftslogik auftritt, wenn Sie create_without_callbacks anrufen. Ziehen Sie in Betracht, die Rückrufe zu entfernen, wenn sie nicht benötigt werden, oder verwenden Sie die Optionen :if und :unless, um den Rückruf nur bei Bedarf auszulösen.

+0

Wenn ich ein Objekt teste, das von einem anderen abhängig ist, möchte ich oft die Abhängigkeit ausspionieren. Leider beschwert mich active_record, dass der Schein nicht vom richtigen Typ ist. In Rails 2 habe ich das geschafft, indem ich Factory Girl benutzt habe, um effektiv Stubs vom richtigen Typ zu erstellen.Ich habe eine Factory-Girl-Strategie hinzugefügt, die einen Datensatz mit der create_without_callbacks-Methode eingefügt hat, da sie irrelevant waren. – opsb

+1

Ich verstehe, aber auf diese Weise würden Sie nicht gegen reale Objekte des Lebens testen. Also im Wesentlichen testen Sie nicht Ihren Anwendungscode. Ich benutze immer Blueprint oder FactoryGirl, um gültige Objekte zu erstellen, einschließlich Callbacks. – Ariejan

+0

Ich benutze Gurke, um Integrationstests durchzuführen. Wenn ich Unit-Tests mache, ist das einzige "echte" Objekt, das mir wichtig ist, dasjenige, das ich gerade teste. – opsb

-1

Ich weiß nicht, ob das alles noch in R3 funktioniert, zumindest in 2.3.8.

wenn es nur ein Attribut ist dann

self.update_attribute(:attribute, value) 

Wenn es mehrere Attribute auf ein Objekt

self.update_attributes({:attribute => value}) 

Sie auch alle Datensätze mit bestimmten Bedingungen aktualisieren

update_all("category = 'authorized' approved = 1, author = 'David'") 

Die das letzte, das ich gerade von der Rails-API genommen habe, denke ich, dass es Callbacks nicht aufruft, aber ich bin mir nicht sicher.

+0

Sie können 'update_attributes' nicht für ein nicht gespeichertes Objekt aufrufen. Das Ziel besteht darin, ein neues Objekt zu erstellen, ohne die Callbacks aufzurufen. – Ariejan

+1

yeah, ich habe das create in den Fragen nicht gesehen. – s84

+0

Sam's Antwort hat mir geholfen –

0

Nachdem wir uns die Quelle für rails3 angesehen haben, scheint es, dass Callbacks so hinzugefügt werden, dass die model.save-Methode sie nicht kennt.

Die Lösung, die ich gegangen bin, ist Modell.find zu verspotten und eine Instanz zurückgeben, die nicht gespeichert wurde. Dies ist eigentlich, wie Unit-Tests durchgeführt werden sollten und sie schneller ausgeführt werden, um zu starten.

Wenn Sie daran interessiert sind, ein Hack bei der Suche nach Ich schlage vor, Sie schauen

  • rails3/Active/lib/active_support/callbacks.rb
  • rails3/activemodel/lib/active_model/callbacks.rb
  • Schienen/activerecord/lib/active_record/callbacks.rb

in dieser Reihenfolge.