アクティブなレコードクラスは、オブジェクト値を宣言されたバイナリ属性に割り当てるときに 'method_missing'をスローします

私はレールの外でActive Recordを使用しています。私は以下のような2つのARクラスを持っています:

class Building < ActiveRecord::Base
   has_many :rooms
   serialize :current_room, Room

そして

class Room < ActiveRecord::Base
   belongs_to :building

I had originally migrated the database tables to have the current_room column be declared as a :room instead of a :binary, which worked, but made my db schema unusable due to the unknown type, そして potentially would make my implementation non database independent. (using sqlite3, haven't tried another yet)

:room からテーブルの列タイプを:binary に変更したとき、建物をナビゲートするときにcurrent_room変数を変更しようとすると「未定義メソッド」エラーが発生しました部屋から部屋まで。このエラーは、dがビルディングオブジェクトであるirbでは次のようになります。

irb(main):006:0> d.current_room = d.rooms.first
NoMethodError: undefined method `gsub' for #
    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activemodel-3.1.1/lib/active_model/attribute_methods.rb:385:in `method_missing'
    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/attribute_methods.rb:60:in `method_missing'
    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/sqlite_adapter.rb:24:in `binary_to_string'
    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/connection_adapters/column.rb:84:in `type_cast'
    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/attribute_methods/dirty.rb:89:in `field_changed?'
    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/attribute_methods/dirty.rb:63:in `write_attribute'
    from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activerecord-3.1.1/lib/active_record/attribute_methods/write.rb:14:in `current_room='
    from (irb):6
    from C:/Ruby192/bin/irb:12:in `
'

I presume it is because the object attribute isn't treating it like a Room object, which is understそしてable, but I thought the serialize method solved that issue. d.current_room.class そして d.rooms.first.class both return Room as the object class, as well. Is there a way to have this work properly without overwriting the assignment methods?

0
ちょうどFYI - これがあなたの質問に対する答えであれば、あなたはこの問題に遭遇する次の人のための答えとしてそれを入力することができます(そして、奨励されます)。あなたは24時間後にあなた自身の答えを受け入れることができます。
追加された 著者 jefflunt,
投稿直後に私に起こったのは、シリアライズはテキストの列型を意味していました。しかしそれはまだ直観に反しているようです。テキストでシリアライズすることができれば、どうして私はバイナリを使うのですか?
追加された 著者 BitPuncher,

2 答え

私はあなたのエラーメッセージに関して具体的に答えます。私は通常、エラーメッセージを注意深く読むと、通常、間違っていることを正確に教えてくれることが分かります。この場合、...

NoMethodError: undefined method `gsub' for #

It's saying that gsub is not defined for Room. So basically, your code at some point is trying to do something like...

room_instance.gsub('something', 'else')

So I don't think it's a problem with binary vs string. I'd look at your code and search for gsub to see exactly where the problem is. Also, gsub is usually called on strings.

1
追加された
はい、これは問題ですが、不適切な方法で何かをしようとすると、それは外的なものだったと思います。私は自分のコードをチェックして、自分のどこにでもgsubを呼び出さない。エラー応答の3行目で参照されている binary_to_string でおそらく呼び出されています。
追加された 著者 BitPuncher,

Serializeは、バイナリではなく、文字列型を対象としています。列の型をstringに変更すると、すべてが適切に機能します。

0
追加された