Я использую Active Record вне рельсов, и у меня есть два класса AR, аналогичные приведенным ниже:
class Building < ActiveRecord::Base
has_many :rooms
serialize :current_room, Room
и
class Room < ActiveRecord::Base
belongs_to :building
Я первоначально перенес таблицы базы данных, чтобы иметьстолбец current_room был объявлен как :room
вместо :binary
, что сработало, но сделало мою схему БД непригодной из-за неизвестного типа и потенциально сделало бы мою реализацию независимой от базы данных.(используя sqlite3, еще не пробовал другой)
Когда я изменил тип столбца таблицы на :binary
с :room
, я начал получать ошибку «неопределенный метод» при попытке изменить переменную current_room какЯ перемещаюсь по зданию из комнаты в комнату.Ошибка выглядит следующим образом в irb, где d - это строительный объект:
irb(main):006:0> d.current_room = d.rooms.first
NoMethodError: undefined method `gsub' for #<Room:0x1f6c260>
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 `<main>'
Я предполагаю, что это связано с тем, что атрибут объекта не воспринимает его как объект Room, что понятно, но я подумал, чтоМетод сериализации решил эту проблему.d.current_room.class
и d.rooms.first.class
оба возвращают Room как класс объектов.Есть ли способ правильно выполнить эту работу, не переписывая методы присваивания?