シリアル化されたフィールドを持つ既存のユーザーがいて、最近のメッセージを配列/シリアル化されたフィールドに追加できるようにしたい。
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
私が間違っている場所に関するアイデアはありますか?
クラスを 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>
タイプが一致しない場合は、既存のフィールドを変換する必要があることに注意してください。
これは、初めてアイテムを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
次のコードを試すこともできます:-デフォルトでは@user.recent_messages
はnil
@user.recent_messages ||= []
@user.recent_messages << params[:message]
@user.save