2008-10-22 5 views
4

J'ai les modèles suivants.Dans Ruby on Rails, comment associer un modèle polymorphe à un modèle avec espace de noms?

# app/models/domain/domain_object.rb 
class Domain::DomainObject < ActiveRecord::Base 
    has_many :links_from, :class_name => "Link", :as => :from, :dependent => :destroy 
end 

# app/models/link.rb 
class Link < ActiveRecord::Base 
    belongs_to :from, :polymorphic => true 
    belongs_to :object_value, :polymorphic => true 
end 

Le problème est, quand je fais ce qui suit, le préfixe from_type ne pas l'espace de noms de domaine au modèle par exemple

Domain::DomainObject.all(:include=> :links_from) 

qui provoque la SELECT suivante:

SELECT `links`.* FROM `links` WHERE (`links`.`from_id` IN (5,6,12,13,18,24,25,27,29,30,31,32,34,35,39) and `links`.`from_type` = 'DomainObject') 

La requête doit être:

SELECT `links`.* FROM `links` WHERE (`links`.`from_id` IN (5,6,12,13,18,24,25,27,29,30,31,32,34,35,39) and `links`.`from_type` = 'Domain::DomainObject') 

parce que Rails enregistre automatiquement le modèle avec l'espace de noms.

Je l'ai vu quelques recommandations sur les sites Rails faire quelque chose comme ceci:

belongs_to :from, :polymorphic => true, :class_name => "Domain::DomainObject" 

Cependant, cela ne semble pas fonctionner non plus.

Alors, y a-t-il une meilleure façon de procéder? Ou n'est-ce pas supporté?

Répondre

5

Pour résoudre ce problème, je l'ai un include Domain dans le modèle DomainObject et mis ActiveRecord::Base.store_full_sti_class = true dans config/environment.rb.

1

La réponse de hoyhoy est la solution. Cela a également résolu mon problème (en fait, je voulais que l'espace de noms soit supprimé).

Cependant, je recommanderais que x.store_full_sti_class = true soit ajouté à config/environment.rb, seulement si on le souhaite globalement. J'imagine que ce n'est pas toujours nécessaire, auquel cas nous pouvons facilement traduire la solution au niveau de la classe.

class User < ActiveRecord::Base 
    self.store_full_sti_class = true 
    ... 
end 
Questions connexes