0

シリアル化された配列があります

class Enviroment < ActiveRecord::Base
serialize :roles, Array

...
t.column :roles, :string, :default=> Array.new

そして、私は次のようなことをしたいと思います

Enviroment.find(1).roles.push 'thing'
4

1 に答える 1

2

このようなデフォルト値を指定すると、その YAML 表現が String としてデータベースに保存され、Rails はそれを非シリアル化して文字列に戻します。それが機能していない理由です。

textまた、配列が長くなっても切り捨てられないように、列の型として使用したい場合があります。最近の Rails 構文では、次のようになります。

t.text :roles

また、新しいロールをデータベースに保存する場合は、後でオブジェクトを保存する必要があります (has_manyキーが他のテーブルにあるために自動的に保存される関連付けとは対照的です)。

e = Environment.find(1)
e.roles.push 'thing'
e.save

または、絶対にワンライナーにする必要がある場合:

Environment.find(1).tap{|e| e.roles.push 'things'}.save
于 2012-04-17T18:10:43.453 に答える