comment accéder à des rails de joindre les attributs de modèle lors de l'utilisation de has_many :through
J'ai un modèle de données à quelque chose comme ceci:
# columns include collection_item_id, collection_id, item_id, position, etc
class CollectionItem < ActiveRecord::Base
self.primary_key = 'collection_item_id'
belongs_to :collection
belongs_to :item
end
class Item < ActiveRecord::Base
has_many :collection_items
has_many :collections, :through => :collection_items, :source => :collection
end
class Collection < ActiveRecord::Base
has_many :collection_items, :order => :position
has_many :items, :through => :collection_items, :source => :item, :order => :position
end
Un Élément peut apparaître dans plusieurs collections et aussi plus d'une fois dans la même collection à des positions différentes.
Je suis en train de créer une méthode d'assistance que crée un menu contenant tous les éléments dans chaque collection. Je veux utiliser le collection_item_id de garder une trace de l'élément actuellement sélectionné entre les demandes, mais je ne peux pas accéder aux attributs de la jointure modèle via la classe de l'Élément.
def helper_method( collection_id )
colls = Collection.find :all
colls.each do |coll|
coll.items.each do |item|
# !!! FAILS HERE ( undefined method `collection_item_id' )
do_something_with( item.collection_item_id )
end
end
end
J'ai essayé, mais il échoue également avec ( undefined method `collection_item' )
do_something_with( item.collection_item.collection_item_id )
Edit: merci à serioys sam de remarquer que le dessus est bien évidemment faux
J'ai également essayé d'accéder à d'autres attributs de la jointure modèle, comme ceci:
do_something_with( item.position )
et:
do_something_with( item.collection_item.position )
Edit: merci à serioys sam de remarquer que le dessus est bien évidemment faux
mais ils échouent également.
Quelqu'un peut me conseiller comment procéder?
Modifier: -------------------->
J'ai trouvé de la documentation en ligne à l'aide de has_and_belongs_to_many va s'attacher à la jointure de la table d'attributs de récupéré des éléments, mais apparemment, il est obsolète. Je n'ai pas encore essayé.
Actuellement, je suis en train de travailler sur la modification de mon modèle de la Collection comme ceci:
class Collection < ActiveRecord::Base
has_many :collection_items, :order => :position, :include => :item
...
end
et évolution de l'aide pour utiliser coll.collection_items au lieu de coll.les éléments
Modifier: -------------------->
J'ai changé mon aide pour travail en tant que ci-dessus et il fonctionne très bien - (merci sam)
Il fait un gâchis de mon code, en raison d'autres facteurs ne sont pas détaillées ici - mais rien qu'une heure ou deux de re-factoring l'habitude de trier.
OriginalL'auteur Noel Walters | 2009-03-12
Vous devez vous connecter pour publier un commentaire.
Dans votre exemple, vous avez défini dans l'Élément de modèle de relation has_many pour collection_items et des collections de l'généré association de la méthode est collection_items et des collections respectivement les deux d'entre eux renvoie un tableau de la façon dont vous essayez d'accéder n'est pas bon. c'est principalement le cas de mant à de nombreuses relations. il suffit de cocher cette Asscociation Documentation pour référence ultérieure.
OriginalL'auteur serioys sam
Cela échoue parce que l'article n'est pas un collection_item_id membre.
Cela échoue parce que l'article n'est pas un collection_item membre.
Rappelez-vous que la relation entre l'élément et collection_items est un has_many. L'article a collection_items, et pas seulement un seul élément. Aussi, chaque collection a une liste d'éléments d'une collection. Ce que vous voulez faire est probablement de cette:
Un couple de d'autres morceaux de conseils:
Je vous recommande de coller avec has_many :through, parce que has_and_belongs_to_many est plus confuse et n'offre pas d'avantages réels.
OriginalL'auteur Antti Tarvainen
J'ai été en mesure de le faire fonctionner pour l'un de mes modèles:
Dans votre cas, quelque chose comme cela devrait fonctionner (ne l'ai pas testé):
Maintenant, vous devriez être en mesure d'accéder à la CollectionItem à partir d'un Élément aussi longtemps que vous avez accès à vos articles comme ceci (
items.with_join
):Ici est un plus générale de la solution que vous pouvez utiliser pour ajouter ce comportement à tout
has_many :through
de l'association:http://github.com/TylerRick/has_many_through_with_join_model
OriginalL'auteur Tyler Rick