Per l'assegnazione di massa di valori a un modello ActiveRecord senza salvare, utilizzare i metodi assign_attributeso attributes=. Questi metodi sono disponibili in Rails 3 e versioni successive. Tuttavia, ci sono piccole differenze e aspetti da considerare relativi alla versione.
Entrambi i metodi seguono questo utilizzo:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
Si noti che nessuno dei due metodi eseguirà convalide o eseguirà callback; i callback e la validazione avverranno quandosave viene chiamato.
Rotaie 3
attributes=differisce leggermente da assign_attributesin Rails 3. attributes=verificherà che l'argomento passato ad esso sia un hash e ritorni immediatamente in caso contrario; assign_attributesnon ha tale controllo hash. Consultare la documentazione dell'API di assegnazione degli attributi ActiveRecord perattributes= .
Il seguente codice non valido fallirà silenziosamente semplicemente ritornando senza impostare gli attributi:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes= si comporteranno silenziosamente come se gli incarichi fossero stati eseguiti con successo, quando in realtà non lo erano.
Questo codice non valido genererà un'eccezione quando assign_attributestenta di stringere le chiavi hash dell'array che la racchiude:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributesgenererà NoMethodErrorun'eccezione per stringify_keys, indicando che il primo argomento non è un hash. L'eccezione in sé non è molto istruttiva sulla causa reale, ma il fatto che si verifichi un'eccezione è molto importante.
L'unica differenza tra questi casi è il metodo utilizzato per l'assegnazione di massa: attributes=riesce silenziosamente e assign_attributesgenera un'eccezione per informare che si è verificato un errore.
Questi esempi possono sembrare inventati e sono in una certa misura, ma questo tipo di errore può facilmente verificarsi durante la conversione di dati da un'API o anche solo usando una serie di trasformazione dei dati e dimenticando Hash[]i risultati del finale .map. Mantieni alcune righe del codice 50 sopra e 3 funzioni rimosse dall'assegnazione degli attributi e hai una ricetta per il fallimento.
La lezione con Rails 3 è questa: usa sempreassign_attributes invece diattributes= .
Rotaie 4
In Rails 4, attributes=è semplicemente un alias di assign_attributes. Consultare la documentazione dell'API di assegnazione degli attributi ActiveRecord perattributes= .
Con Rails 4, entrambi i metodi possono essere usati in modo intercambiabile. Il mancato passaggio di un hash come primo argomento comporterà un'eccezione molto utile:ArgumentError: When assigning attributes, you must pass a hash as an argument.
Validazioni
Se stai preparando degli incarichi di volo in preparazione di un save, potresti essere interessato a convalidare anche prima del salvataggio. È possibile utilizzare i metodi valid?e invalid?per questo. Entrambi restituiscono valori booleani. valid?restituisce vero se il modello non salvato supera tutte le convalide o falso in caso contrario. invalid?è semplicemente l'inverso divalid?
valid? può essere usato in questo modo:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
Ciò ti darà la possibilità di gestire eventuali problemi di convalida prima di chiamare save.