method

serialize

serialize(attr_name, class_name = Object)
public

Specifies that the attribute by the name of attr_name should be serialized before saving to the database and unserialized after loading from the database. The serialization is done through YAML. If class_name is specified, the serialized object must be of that class on retrieval or SerializationTypeMismatch will be raised.

3Notes

Another Example

mileszs · Nov 12, 20086 thanks

Do not mistakenly pass class_name as a key/value pair (Hash form). You will get an error including the text 'class or module needed'. It should look like this:

serialize :some_array, Array

Or, perhaps clearer would be:

serialize(:some_array, Array)

That may seem obvious, but it is common to be in the habit of passing things as a key/value pair.

Beware - May cause performance issues

cowlibob · Mar 18, 20135 thanks

A serialized attribute will always be updated during save, even if it was not changed. (A rails 3 commit explains why: http://github.com/rails/rails/issues/8328#issuecomment-10756812)

Guard save calls with a changed? check to prevent issues.

class Product < ActiveRecord::Base
serialize :product_data
end

bad

product = Product.first
product.save

good

product = Product.first
product.save if product.changed?

Do not mistakenly use serialize like other similar directives - attr_accessible, attr_accessor

vighnesh1987 · May 30, 20132 thanks

serialize seems very similar to other directives that work on attributes such as attr_accessible. One may mistakenly assume that serialize can take a list of attributes. For eg:

class Tuk < ActiveRecord::Base
attr_accessible :foo, :bar
serialize :foo, :bar
end

This may lead to a cryptic error. Eg.

puts !Tuk.first.foo.nil?

causes:

NoMethodError at /file:location undefined method `new' for :bar:Symbol

This is because it tries to parse the YAML string stored in foo as an instance of :bar.