Object#is_a?
單表繼承在導軌3我有單表繼承設置如下奇怪方式失敗(簡化爲簡潔起見):is_a?失敗,並在導軌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)
返回true。
世界上可能會發生什麼?
我已經注意到在軌道2.3.14/ruby的相同問題1.8.7 – Sukima 2012-04-04 19:36:11