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)
правда.
Что в мире может здесь происходить?