Object#is_a?
is failing in the strangest way in Rails 3. I have single-table-inheritance set up as follows (simplified for brevity):
# resource.rb
class Resource < ActiveRecord::Base
# blah blah
end
# video.rb
class Video < Resource
# blah blah
end
In my controller, I have this:
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
Invoking the #create
action generates these log results:
@resource class: Video
@resource superclass: Resource
@resource is_a?(Video): true
@resource is_a?(Resource): false
@resource is_a?(ActiveRecord::Base): true
Note that the Video
instance is an ActiveRecord::Base
, yet it is not a Resource
. This is not merely an academic concern. Framework code called from the action uses is_a?
to check for a type mismatch, and it raises when it thinks the Video
is not a Resource
.
Yet in the Rails console, is_a?(Resource)
returns true.
What in the world could be going on here?