9

J'ai une table Foo qui a une association appartenant à polymorphe appelée bar. La table foos a la colonne standard bar_id. Cependant, au lieu d'une colonne bar_type basée sur une chaîne, j'ai une colonne entière bar_type_id. Cette colonne fait référence à la colonne id dans le tableau bar_types. bar_types.name contient le nom de la classe qui représente la classe de l'instance bar particulière.Assocations polymorphes utilisant des champs de type ID entier

Est-ce que Rails (idéalement> = 2.3.10) permet ce type d'association polymorphique?

+2

En ce qui concerne ce n'est pas association polymorphique Standart vous devriez écrire par vous-même. – fl00r

Répondre

10

Nous l'avons fait en redéfinissant la association_class méthode dans un nouveau module et l'a inclus en utilisant l'option :extend. Aussi créé un entier pour hacher la table de hachage pour rendre les choses plus faciles.

Dans config/initializers répertoire ou partout où vous le souhaitez, créez un fichier et définir le hachage INT_OBJECT_TYPE_TO_CLASSNAME = { 0 => "Project", 1 => "Task", 2 => "Timesheet" }

class CommentObjectType < ActiveRecord::Base 
    module ClassNamesAsInt 
    def association_class 
     return INT_OBJECT_TYPE_TO_CLASSNAME[restricted_object_type].constantize 
    end 
    end 
end 

Dans comments.rb

belongs_to :commentable, :polymorphic => true, :extend => CommentObjectType::ClassNamesAsInt 
0

Il existe deux approches pour cela.

premier est facile:

has_many :bars, :conditions => "whatever you want" 

Second pourrait être difficile:

set_inheritance_column :bar_type_id 
0

Je ne suis pas sûr, mais vous pouvez jouer

belongs_to :bar, :class_name => proc{ BarType.find(self.bar_type_id).name }, :foreign_key => :bar_id 
2

Je fais usage de la pierre précieuse polymorphic integer type, écrit par un de mes collègues. C'est un peu plus facile à utiliser que les exemples donnés ci-dessus, à mon avis. Par exemple, après avoir configuré le mappage, vous changez de:

belongs_to :actor,    polymorphic: true 

au nouveau format:

belongs_to :actor,    polymorphic: true, integer_type: true 
Questions connexes