Rails: How to handle "Attribute was supposed to be a Array, but was a String" error?

activerecord, arrays, ruby-on-rails, serialization, string

Solution

From the fine manual:

serialize`(attr_name, class_name = Object)` [...] The serialization is done through YAML.

So the column should contain a YAMLized version of your `image_urls` but `'["image1.jpg", "image2.jpg"]'` is not a YAML array. If you want to muck around with the raw serialized data then you should use something like

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

to generate the string.

Or better, stop using `serialize` altogether in favor of a separate table.

Problem

I have a table with one column that is of text type. There's a small string in it that should be serialized as an array ``` serialize :image_urls, Array ``` There are times when SQL is just faster for inserting data. When this is the case, I do the insert as a string ``` ["image1.jpg", "image2.jpg"] ``` Since I'm inserting a string my Rails app crashes when it tries to read the data, with the following error message: ``` Attribute was supposed to be a Array, but was a String ``` Is there a way to not have this error thrown, or to catch it and convert the data? I mean converting the string to an array is just a simple call, so, this should be easy. I just don't know where, or how to accomplish it. I sort of think overriding object_from_yaml, but I'm not sure where to do this work. Am I in the right track?

Original source