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
,但它不是一个Resource
。这不仅仅是一个学术问题。从操作调用的框架代码is_a?
用于检查类型不匹配,当它认为Video
不是Resource
.
然而在 Rails 控制台中,is_a?(Resource)
返回 true。
这里到底发生了什么?