это?завершается с наследованием одной таблицы в Rails 3 - PullRequest
6 голосов
/ 08 декабря 2010

Object#is_a? самым странным образом терпит неудачу в Rails 3. У меня единственная таблица наследования настроена следующим образом (упрощено для краткости):

# resource.rb
class Resource < ActiveRecord::Base
  # blah blah
end

# video.rb
class Video < Resource
  # blah blah
end

В моем контроллере у меня есть это:

def create
  @resource = Resource.find params[:resource_id]
  logger.info '@resource class: ' + @resource.class.name
  logger.info '@resource superclass: ' + @resource.class.superclass.name
  logger.info '@resource is_a?(Video): ' + @resource.is_a?(Video).inspect
  logger.info '@resource is_a?(Resource): ' + @resource.is_a?(Resource).inspect
  logger.info '@resource is_a?(ActiveRecord::Base): ' + @resource.is_a (ActiveRecord::Base).inspect
  # Do some other stuff
end

Вызов действия #create создает следующие результаты журнала:

@resource class: Video
@resource superclass: Resource
@resource is_a?(Video): true
@resource is_a?(Resource): false
@resource is_a?(ActiveRecord::Base): true

Обратите внимание, что Video экземпляр равен и ActiveRecord::Base, но он не является a Resource.Это не просто академическая проблема.Код платформы, вызываемый из действия, использует is_a? для проверки несоответствия типов, и он возникает, когда думает, что Video не является Resource.

Все же в консоли Rails возвращается is_a?(Resource)правда.

Что в мире может здесь происходить?

Ответы [ 2 ]

3 голосов
/ 08 декабря 2010

Решение, по-видимому, заключается в перезапуске процесса сервера Rails. Я не знаю, как эта ошибка закралась, но это произошло. Более того, это происходило несколько раз на нескольких компьютерах.

Итак, для всех, кто столкнулся с этой проблемой, просто перезапустите сервер. Что бы это ни было, это эфемерно.

0 голосов
/ 08 декабря 2010

Имеет ли найденная вами запись Video в столбце type?

Поиск в коллекции суперкласса найдет объекты подкласса, и я предполагаю, что даже если вы явно искали коллекцию Resource,фактический объект, который вы нашли, был Video.

Не знаю, что такое несоответствие в консоли Rails!Rails переопределяет is_a? для ActiveSupport::TimeWithZone, но в вашем случае Rails не должен манипулировать именами классов или чем-либо еще ...

Может быть, вы использовали разные идентификаторы в консоли и в вашем контроллере?

...