2011-01-19 3 views
0

J'ai deux types de classes, dont l'une appartient à l'autre, et l'une appartient à l'autre.bidirectionnel appartient à (un polymorphe)

class Term < ActiveRecord::Base 
    belongs_to :reference, :polymorphic => true 
end 

class Course < ActiveRecord::Base 
    belongs_to :term 
end 

class Career < ActiveRecord::Base 
    belongs_to :term 
end 

Les relations appartiennent à parce que je veux un accès rapide dans les deux sens. Je suis sous l'impression que la relation has_one serait plus lente parce que vous auriez à interroger la table opposée pour rechercher un correspondant _id.

En ce moment, quand je crée un cours c, je cours une méthode after_save qui crée un terme t tel que c.term = t et t.reference = c. Cela semble une sorte de hack si ... est-il possible de dire automatiquement aux rails que cette relation existe et que le réglage c.term = t devrait automatiquement faire t.reference = c?

Je sais qu'avec les associations polymorphes, vous pouvez spécifier l'attribut :as (voir le API), mais il semble que cela ne fonctionne pas pour belongs_to.

class Asset < ActiveRecord::Base 
    belongs_to :attachable, :polymorphic => true 

    def attachable_type=(sType) 
     super(sType.to_s.classify.constantize.base_class.to_s) 
    end 
    end 

    class Post < ActiveRecord::Base 
    # because we store "Post" in attachable_type now :dependent => :destroy will work 
    has_many :assets, :as => :attachable, :dependent => :destroy 
    end 

Répondre

1

Oui, vous n'êtes pas vraiment destiné à faire belongs_to bidirectionnelles associations. En tant que tel, quand vous ajoutez la polymorphicalité (est-ce vraiment un mot?) Dans l'équation, il va se casser.

Les relations appartiennent à parce que je veux un accès rapide dans les deux sens. Je suis sous l'impression que la relation has_one serait plus lente car vous devrez interroger la table opposée pour rechercher un _id correspondant.

Je ne vois pas pourquoi vous voudriez faire ceci. Si vous êtes vraiment concerné par la vitesse, vous pouvez simplement indexer les colonnes foreign_key sur la table belongs_to. La différence de vitesse devrait être négligeable.

+0

hmm, d'accord, point pris. ajouter des index et effacer les associations bidirectionnelles 'belongs_to'. Merci. – unsorted

+1

* polymorphisme;) – candrews

Questions connexes