Using Rails serialize to save hash to database

cmwright picture cmwright · Jul 14, 2011 · Viewed 93.9k times · Source

I'm try to save a hash mapping ids to a number of attempts in my rails app. My migration to the database to accommodate this new column:

class AddMultiWrongToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :multi_wrong, :string
  end

  def self.down
    remove_column :users, :multi_wrong
  end
end

In my model I have:

class User < ActiveRecord::Base 
 serialize :multi_wrong, Hash
end

But when I use the rails console to test this by doing:

user = User.create()
user.multi_wrong = {"test"=>"123"}
user.save

The output is false. What's going wrong here?

Answer

Benjamin Tan Wei Hao picture Benjamin Tan Wei Hao · Jul 15, 2011

The column type is wrong. You should use Text instead of String. Therefore, your migration should be:

 def self.up
   add_column :users, :multi_wrong, :text
 end

Then Rails will properly convert it into YAML for you (and perform proper serialization). Strings fields are limited in size and will only hold especially-small values.