is_a?在Rails 3中使用单表继承失败

rlk*_*024 6 ruby ruby-on-rails single-table-inheritance

Object#is_a? 在Rails 3中以最奇怪的方式失败.我的单表继承设置如下(简化为简洁):

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

# video.rb
class Video < Resource
  # blah blah
end
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我有这个:

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
Run Code Online (Sandbox Code Playgroud)

调用该#create操作会生成以下日志结果:

@resource class: Video
@resource superclass: Resource
@resource is_a?(Video): true
@resource is_a?(Resource): false
@resource is_a?(ActiveRecord::Base): true
Run Code Online (Sandbox Code Playgroud)

需要注意的是Video实例一个ActiveRecord::Base,但它不是一个Resource.这不仅仅是一个学术问题.从动作调用的框架代码is_a?用于检查类型不匹配,并在它认为Video不是a 时引发Resource.

然而在Rails控制台中,is_a?(Resource)返回true.

世界上可能会发生什么?

rlk*_*024 3

解决方案显然是重新启动 Rails 服务器进程。我不知道这个错误是如何产生的,但它确实发生了。更重要的是,这种情况在多台计算机上多次发生。

因此,对于遇到此问题的其他人,只需重新启动服务器即可。不管它是什么,它都是短暂的。