2012-04-23 9 views
7

Ho una tabella con una colonna che è di tipo testo. C'è una piccola stringa in esso che deve essere serializzato come un arrayRails: come gestire l'errore "L'attributo doveva essere un array, ma era una stringa"?

serialize :image_urls, Array 

Ci sono momenti in cui SQL è solo più veloce per l'inserimento dati. Quando questo è il caso, faccio l'inserto sotto forma di stringa

["image1.jpg", "image2.jpg"] 

Dal momento che sto inserendo una stringa miei Rails app si blocca quando tenta di leggere i dati, con il seguente messaggio di errore:

Attribute was supposed to be a Array, but was a String 

C'è un modo per non generare questo errore, o per catturarlo e convertire i dati?

Intendo dire convertire la stringa in un array è solo una semplice chiamata, quindi, dovrebbe essere semplice. Non so dove, o come realizzarlo.


Io penso di sovrascrivere object_from_yaml, ma non sono sicuro di dove fare questo lavoro.
Sono sulla buona strada?

risposta

5

Dal fine manual:

serializzare(attr_name, class_name = Object)
[...] La serializzazione viene fatto attraverso YAML.

Quindi la colonna deve contenere una versione YAMLized del vostro image_urls ma '["image1.jpg", "image2.jpg"]' non è un array di YAML. Se si vuole perdere tempo con i dati serializzati grezzi allora si dovrebbe usare qualcosa come

["image1.jpg", "image2.jpg"].to_yaml 
# ---------------------------^^^^^^^ 

per generare la stringa.

O meglio, smettere di usare serialize del tutto a favore di una tabella separata.

+0

I dati sono troppo complessi per normalizzarsi .. O meglio sarebbe un dolore giusto, perché dovrei avere dozzine di tabelle davvero piccole (questo esempio è con un campo, ma ce ne sono parecchie nella tabella) – baash05

+0

Esiste un modo per ignorare la funzione che genera l'errore? – baash05

+0

@dave: correggi i dati nel tuo database: lo hai rotto, lo hai comprato. –

2

In Rails 4 ha funzionato per me senza alcun .to_yaml, appena aggiunto alla params forti come image_urls: []

0

si può provare in questo modo: {: serialized_attribute_name => []}. E non dimenticare di aggiungere questo nel controller appropriato come parametri forti. Mi aiuta quando soffrivo dello stesso problema.

Problemi correlati