2008-10-21 5 views
3

J'ai les classes de 3 rails suivantes, qui sont toutes stockées dans une table, en utilisant l'héritage Single table de rails.Problèmes de recherche d'héritage de table unique

class Template < ActiveRecord::Base 
class ThingTemplate < Template 
class StockThingTemplate < ThingTemplate 

Si j'ai un StockThingTemplate avec ID de 150 alors je devrait logiquement être en mesure de le faire:

ThingTemplate.find(150) 
=> #returns me the StockThingTemplate 

En fait cela fonctionne, parfois

Quand il fonctionne, il génère la requête SQL suivante:

SELECT * FROM templates WHERE (templates.`id` = 159) AND ((templates.`type` = 'ThingTemplate') OR (templates.`type` = 'StockThingTemplate')) 

Quand il ne fonctionne pas, il génère la requête SQL suivante:

SELECT * FROM templates WHERE (templates.`id` = 159) AND ((templates.`type` = 'ThingTemplate')) 

Le sql fait ce qu'il est censé, mais la question est, pourquoi est-il génère un ensemble de SQL une fois, et un ensemble différent une autre fois. C'est littéralement le même code.

Notes:

  • Je suis sur des rails 1,2
  • Je l'ai déjà essayé require 'stock_thing_template' en divers endroits. Il n'a pas d'effet ou provoque d'autres problèmes

Répondre

7

OK. Il s'avère que c'est parce que les rails ne voient pas toute la hiérarchie d'héritage tout le temps. Comme il recharge tous les éléments de chaque requête, cela explique le comportement incohérent (à certains endroits, un before_filter provoquait probablement le chargement des modèles, dans d'autres endroits peut-être pas).

Il peut être fixé en mettant

require_dependency 'stock_thing_template' 

en haut de tous mes contrôleurs qui font référence à ces choses.

More info on the rails wiki - aller au bas de la page

+0

Merci beaucoup. Cela a résolu mon problème aussi! – JasonSmith

Questions connexes