2010-12-07 34 views
5

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。

世界上可能會發生什麼?

+0

我已經注意到在軌道2.3.14/ruby​​的相同問題1.8.7 – Sukima 2012-04-04 19:36:11

回答

2

該解決方案顯然是重新啓動Rails服務器進程。我不知道這個錯誤是如何進入的,但它確實如此。而且,它在多臺計算機上多次發生。

因此,對於遇到此問題的任何人,只需重新啓動服務器即可。不管它是什麼,它都是短暫的。

0

您發現的記錄是否在其type列中有Video

搜索超類集合將查找子類對象,我猜即使您明確搜索了Resource集合,您找到的實際對象也是Video

不知道Rails控制檯中的差異是什麼! Rails覆蓋is_a?ActiveSupport::TimeWithZone,但在你的情況下,Rails不應該用於任何類名或任何東西...

也許你在控制檯和控制器中使用了不同的ID嗎?

+0

是的,它的視頻在它的類型列中。這就是爲什麼它被實例化爲視頻。但在我看來,每個視頻應該是一個資源 - Rails或不是,它仍然是Ruby的繼承。 Video是Resource的一個子類,而is_a?看超類。是的,我在控制檯和控制器中嘗試了完全相同的ID。 – rlkw1024 2010-12-07 22:41:22

+0

另外,我不認爲它與TimeWithZone有什麼關係,因爲該類的is_a定義?在這裏不會使用。 – rlkw1024 2010-12-07 22:46:36