2016-06-27 22 views
0

Ich bin in den Prozess der einige Funktionen verändern und als solche möchte ich find_or_initialize_by verwenden newKann ich einen neuen Datensatz füllen/aktualisieren, nachdem find_or_initialize_by mit einer Zeile wie bei new() verwendet wurde?

Meine modal 13 Spalten hat

modal = Modal.new(col1: col1, col2: col2..... col13: col13) 

Der neue Code ist zu ersetzen:

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) 

und jetzt muss ich entweder füllen oder die restlichen 11 Spalten aktualisieren.

Kann dies in einer Zeile erfolgen? Ich würde lieber nicht schreiben:

modal.col1 = col1 
modal.col2 = col2 
.... 
modal.col13 = col13 

Dank

Antwort

2

Sie können einen Block übergeben Sie die Attribute auf die neuen Datensätze zu setzen. Dies ist nützlich, wenn Sie sie mit einigen Werten erstellen möchten und Sie die vorhandenen Datensätze nicht überschreiben möchten.

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) do |record| 
    record.col4 = col4 
    record.col5 = col5 
    # etc 
end 

Sie können mit der Syntax spielen sie oneline, mit #attributes=:

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) { |r| r.attributes = { col4: col4, col5: col5 } } 

Beachten Sie, dass #attributes= nur die Werte setzen, müssen Sie manuell speichern. Wenn Sie .find_or_create_by anstelle von .find_or_initialize_by verwenden, wird der neue Datensatz validiert und gespeichert, nachdem der Block ausgeführt wurde.

Wenn Sie die Attribute des Datensatzes festlegen möchten, unabhängig davon, ob es neu ist oder nicht:

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) 
modal.attributes = { col4: col4, col5: col5 } 

Sie auch #update_attributes verwenden können, aber Ihr Datensatz wird bestätigt und gespeichert werden.

modal = Modal.find_or_initialize_by(col1: col1, col3: col3) 
modal.update_attributes(col4: col4, col5: col5) 
+1

Vielen Dank für die Hilfe, die viel schöner aussieht! –

+0

Ich musste dies als Antwort abwählen. Der Block wird nur aufgerufen, wenn ein neuer Datensatz erstellt wird, sodass ein vorhandener Datensatz nicht aktualisiert wird. –

+0

Oh! Ich wusste nicht, dass Sie die Attribute für alle neuen oder vorhandenen Datensätze festlegen mussten. Ich werde die Antwort bearbeiten :) –