web-dev-qa-db-ja.com

シリアル化された配列に追加する方法

シリアル化されたフィールドを持つ既存のユーザーがいて、最近のメッセージを配列/シリアル化されたフィールドに追加できるようにしたい。

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

私が間違っている場所に関するアイデアはありますか?

35
grabury

クラスを serialize に渡すことができます。

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

上記により、recent_messagesArrayです:

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

タイプが一致しない場合は、既存のフィールドを変換する必要があることに注意してください。

56
Stefan

これは、初めてアイテムを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
2
jackbot

次のコードを試すこともできます:-デフォルトでは@user.recent_messagesはnil

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