So überschreiben Sie die "neue" Methode für ein Schienenmodell

7

In meiner Rails App habe ich ein Modell mit einem Startdatum und einem Enddatum. Wenn der Benutzer Jan 1, 2010 als Startdatum und 5. Januar 2010 als Enddatum auswählt, möchte ich, dass 5 Instanzen meines Modells erstellt werden (eines für jeden ausgewählten Tag). Es sieht also ungefähr wie

aus %Vor%

Ich weiß, ein Weg, um damit umzugehen, ist eine Schleife im Controller zu machen. Etwas wie ...

%Vor%

Ich möchte jedoch meinen Controller dünn halten, außerdem möchte ich die Modelllogik außerhalb davon behalten. Ich vermute, ich muss die "neue" Methode im Modell überschreiben. Was ist der beste Weg, dies zu tun?

    
Lan 07.12.2010, 13:18
quelle

7 Antworten

16

Wie @rad sagt, wollen Sie auf keinen Fall initialisieren. Obwohl Sie after_initialize überschreiben können, sieht das hier nicht wirklich so aus, wie Sie es wollen. Stattdessen möchten Sie wahrscheinlich eine Factory-Methode zur Klasse hinzufügen, wie es @Pasta vorschlägt. Fügen Sie das zu Ihrem Modell hinzu:

%Vor%

Und dann fügen Sie das Ihrem Controller hinzu:

%Vor%     
Trotter 07.12.2010, 17:11
quelle
10

Überschreibe nicht initialize Es könnte möglicherweise eine Menge Zeug in deinen Modellen zerstören. WENN wir wüssten, warum Sie Hilfe brauchen, können wir besser helfen (verstehen Sie Ihre Erklärung der Form, die ein Skelett ist, nicht vollständig, wollen Sie, dass Formularattribute andere Attribute erzeugen, siehe unten). Ich benutze oft einen Haken, wie Marcel vorgeschlagen hat. Wenn Sie möchten, dass es immer und nicht nur vor dem Erstellen oder Speichern eines Objekts geschieht, verwenden Sie den after_initialize -Hook.

%Vor%

Auch wenn Sie nur nach einigen Standardwerten suchen, können Sie Standardaccessoren bereitstellen, etwa: (wobei some_attribute dem Spaltennamen Ihres Modellattributs entspricht)

%Vor%

oder ein Schreiber

%Vor%

Wenn ich Ihren Kommentar richtig verstanden habe, sieht es so aus, als würden Sie ein Formular veröffentlichen, das Ihr Modell unvollständig machen würde, während die anderen Attribute auf Teilen dieses Formulars basieren würden? In diesem Fall können Sie eine der oben genannten Methoden after_initialize oder some_attribute= verwenden, um dann andere Attribute in Ihrem Modell zu erstellen.

    
brad 07.12.2010 14:36
quelle
2

Ich denke, Sie möchten Standardwerte für Ihr Modellattribut festlegen?

Es gibt eine andere Lösung als das Überschreiben; Sie können Rückrufe einstellen:

%Vor%     
Marcel Falliere 07.12.2010 13:55
quelle
2

Warum erstellst du nicht einfach eine Methode in dein Modell?

%Vor%

enthält diese Logik (im Grunde Ihre Schleife?)

    
Pasta 07.12.2010 13:25
quelle
2

Sie können verwenden:

%Vor%

Obwohl ich irgendwo gelesen habe, war es nicht empfehlenswert ...

    
jordinl 07.12.2010 14:04
quelle
2

Das riecht nach der Fabrikmethode Patttern ... suchen Sie es aus.

Wenn Sie aus irgendeinem Grund mit create_date per @Pasta nicht einverstanden sind, erstellen Sie möglicherweise nur ein einfaches Ruby-Objekt (nicht ActiveRecord unterstützt) mit dem Namen YourModelFactory / Template / Was auch immer mit zwei Instanzvariablen - Sie können Ihre Standardparameter verwenden [: foo] um diese zuzuweisen - dann definiere und rufe eine Methode für diese Klasse auf, die deine realen Objekte zurückgibt.

Ihre Steuerungslogik sieht jetzt ungefähr so ​​aus:

%Vor%

Viel Glück.

    
Cory 07.12.2010 15:28
quelle
0

Strengstens, wenn auch spät, ist

die richtige Methode, neu in einem Modell zu überschreiben %Vor%     
s1mpl3 19.09.2017 02:37
quelle

Tags und Links