2011-01-09 4 views
14

Je tire des données d'une API externe et voudrais mettre en cache les résultats localement. J'ai un class SearchTerm, que je voudrais être associé à quelques types différents ActiveRecord à travers la table searchable_items. Je suis sûr que j'ai les tables correctement, mais quelque chose dans mes associations doit être faux.Rails polymorphique has_many: à travers

class Foo < ActiveRecord::Base 
    has_many :search_terms, :as => :searchable, :through => :searchable_items 
end 

class Bar < ActiveRecord::Base 
    has_many :search_terms, :as => :searchable, :through => :searchable_items 
end 

class SearchTerm < ActiveRecord::Base 
    has_many :searchables, :through => :searchable_items 
end 

class SearchableItem < ActiveRecord::Base 
    belongs_to :search_term 
    belongs_to :searchable, :polymorphic => true 
end 

Je pense pouvoir faire quelque chose comme SearchTerm.find_by_term('SearchTerm').searchables (et il retourne un tableau d'objets Foo et Bar) cependant, je reçois l'erreur Could not find the association :searchable_items in model SearchTerm

Merci d'avance pour toute perspicacité dont vous peut me fournir!

Répondre

11

Vous devez ajouter has_many :searchable_items association à Foo, Bar et SearchTerm modèles, car l'option :through => :searchable_items fait référence à cette association.

http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

+5

Malheureusement, en ajoutant ce que vous suggérez donne 'ne peut pas avoir une has_many: par l'association 'searchTerm #' sur Searchables l'objet polymorphes « interrogeable # searchable'.' de – lyricat

+8

configuration similaires ici: http: // stackoverflow. com/questions/1683265/activerecord-a-plusieurs-à-travers-et-polymorphique-associations – Heikki

+3

Comme le message d'erreur dit, vous ne pouvez pas avoir beaucoup d'à travers l'association sur l'objet polymorpique. Vous pourriez avoir séparé plusieurs passages pour 'Foo' et' Bar' comme dans la question ci-dessus. – Heikki

Questions connexes