класс активной записи выдает 'method_missing' при назначении значения объекта объявленному двоичному атрибуту - PullRequest
0 голосов
/ 28 октября 2011

Я использую 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 как класс объектов.Есть ли способ правильно выполнить эту работу, не переписывая методы присваивания?

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Я отвечу специально относительно вашего сообщения об ошибке. Я обычно нахожу, что, если я внимательно читаю сообщения об ошибках, это обычно говорит мне точно, что не так. Так что в этом случае ...

NoMethodError: undefined method `gsub' for #<Room:0x1f6c260>

Это говорит о том, что gsub не определено для Room. В общем, ваш код в какой-то момент пытается сделать что-то вроде ...

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

Так что я не думаю, что это проблема двоичной строки против строки. Я посмотрю на ваш код и поищу gsub, чтобы точно определить, в чем проблема. Кроме того, gsub обычно вызывается для строк.

0 голосов
/ 29 октября 2011

Сериализация предназначена для строковых столбцов, а не для двоичных файлов. Когда тип столбца изменяется на строку, все работает правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...