Подтвердить что ты не робот

Как добавить к сериализованному массиву

У меня есть существующий пользователь, у которого есть сериализованное поле, и я хочу иметь возможность добавлять последние сообщения в массив/сериализованное поле.

class User < ActiveRecord::Base
 serialize :recent_messages
end

В контроллере я пробовал

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

но я получаю следующую ошибку:

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

В моей схеме я:

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

Любые идеи о том, где я ошибаюсь?

4b9b3361

Ответ 1

Вы можете передать класс serialize:

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

Приведенное выше гарантирует, что recent_messages является Array:

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

Обратите внимание, что вам может потребоваться преобразовать существующие поля, если типы не совпадают.

Ответ 2

Это потому, что в первый раз, когда вы пытаетесь нажимать элемент на свой recent_messages, нет массива для ввода элемента (по умолчанию это nil). Поэтому вы должны создать массив, прежде чем вы сможете нажать на него

@user = current_user
if @user.recent_messages.nil?
  @user.recent_messages = [params[:message]]
else
  @user.recent_messages << params[:message]
end
@user.save

Ответ 3

Вы также можете попробовать следующий код: - По умолчанию @user.recent_messages будет nil

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