How to add to a serialized array
Asked Answered
P

3

40

I have an existing user which has a serialized field and I want to be able to add recent messages to the array / serialized field.

class User < ActiveRecord::Base
 serialize :recent_messages
end

In the controller I've tried

@user = current_user
@user.recent_messages << params[:message]
@user.save

but I get the following error:

NoMethodError (undefined method `<<' for nil:NilClass):

In my schema I have:

create_table "users", :force => true do |t|
    t.text     "recent_messages"
  end

Any ideas on where I'm going wrong?

Panoply answered 2/10, 2013 at 9:52 Comment(1)
For reference: you can look at #45067171 for building forms that behave well with respect to arraysVictualer
B
64

You can pass a class to serialize:

class User < ActiveRecord::Base
  serialize :recent_messages, Array
end

The above ensures that recent_messages is an Array:

User.new
#=> #<User id: nil, recent_messages: [], created_at: nil, updated_at: nil>

Note that you might have to convert existing fields if the types don't match.

Blackstock answered 2/10, 2013 at 10:25 Comment(0)
I
2

It's because the first time you try to push an item to your recent_messages, there's no array to push the item into (the field is nil by default). So you must create the array before you can push to it

@user = current_user
if @user.recent_messages.nil?
  @user.recent_messages = [params[:message]]
else
  @user.recent_messages << params[:message]
end
@user.save
Illative answered 2/10, 2013 at 10:6 Comment(0)
F
2

You can also try following code:- By default @user.recent_messages would be nil

@user.recent_messages ||= []
@user.recent_messages << params[:message]
@user.save
Fite answered 2/10, 2013 at 10:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.