serialize
serialize(attr_name, class_name = Object)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
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
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
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.