2010-12-07 3 views
5

Object#is_a? терпит неудачу в странном образе в Rails 3. Я однотабличное-наследование установить следующий образ (упрощенный для краткости):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: a ActiveRecord::Base, но это не a Resource. Это не просто академическая проблема. Код Framework, вызываемый из действия, использует 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

У вас есть запись, которую вы нашли: Video в своей колонке ?

Поиск в коллекции суперкласса найдет объекты подкласса, и я предполагаю, что, хотя вы явно искали коллекцию Resource, фактический объект, который вы нашли, был Video.

Не знаю, какое несоответствие находится в консоли Rails! Rails переопределяет is_a? для ActiveSupport::TimeWithZone, но в вашем случае Rails не следует перебирать имена каких-либо классов или что-то еще ...

Возможно, вы использовали разные идентификаторы в консоли и контроллере?

+0

Да, она имеет видео в колонке своего типа. Вот почему он создается как видео. Но мне кажется, что каждое видео должно быть ресурсом - Rails или нет, это все еще наследование Ruby. Видео - это подкласс ресурса, а is_a? смотрит на суперклассы. И да, я пробовал с теми же идентификаторами в консоли и контроллере. – rlkw1024 2010-12-07 22:41:22

+0

Кроме того, я не думаю, что это имеет какое-либо отношение к TimeWithZone, поскольку определение этого класса is_a? не будет использоваться здесь. – rlkw1024 2010-12-07 22:46:36

Смежные вопросы