У меня есть следующие 3 класса рельсов, которые хранятся в одной таблице с использованием наследования единой таблицы рельсов.
class Template < ActiveRecord::Base
class ThingTemplate < Template
class StockThingTemplate < ThingTemplate
Если у меня есть StockThingTemplate с идентификатором 150, то я должен логически сделать это:
ThingTemplate.find(150)
=> #returns me the StockThingTemplate
И на самом деле это работает, иногда
Когда он работает, он генерирует следующий SQL-запрос:
SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') OR (templates.`type` = 'StockThingTemplate' ) )
Когда это не работает, он генерирует следующий SQL-запрос:
SELECT * FROM templates WHERE (templates.`id` = 159) AND ( (templates.`type` = 'ThingTemplate') )
Sql делает то, что должен, но вопрос в том, ПОЧЕМУ он генерирует один набор SQL один раз, а другой - другой. Это буквально тот же самый код.
Заметки:
require 'stock_thing_template' в разных местах. Это либо не действует, либо вызывает другие проблемы.




В ПОРЯДКЕ. Оказывается, это потому, что rails не всегда видит всю иерархию наследования. Поскольку он перезагружает все элементы при каждом запросе, это объясняет непоследовательное поведение (в некоторых местах before_filter, вероятно, вызывал загрузку моделей, в других местах, возможно, нет).
Это можно исправить, поставив
require_dependency 'stock_thing_template'
в верхней части всех моих контроллеров, которые ссылаются на эти вещи.
Больше информации в вики о рельсах - перейти в самый низ страницы