2016-11-07 2 views
0

J'ai un modèle Author que has_many :posts, has_many :comments il peut aussi être taggable sur la base des modèles Tagging et Tag que j'ai posté ci-dessous.requête polymorphes pour les balises sur plusieurs objets

class Tagging 
    belongs_to :tag 
    belongs_to :taggable, polymorphic: true 
end 
class Tag 
    has_many :taggings 
    has_many :posts, through: :taggings, source: :taggable, source_type: 'Post' 
    has_many :authors, through: :taggings, source: :taggable, source_type: 'Author' 
end 

Voici ce que mon modèle Author ressemble.

class Author 
    has_many :posts 
    has_many :comments 
    has_many :taggings, as: :taggable 
    has_many :tags, through: :taggings 
end 

Il y a quelques types de requêtes que je suis tentée, mais toutes mes tentatives jettent des erreurs, et je ne peux pas envelopper la tête autour de la façon d'obtenir les données que je veux. Fondamentalement, je voudrais exécuter des requêtes pour les scénarios suivants:

  • Disons que j'ai un objet auteur @author = Author.find(1). Comment procéder pour regrouper tous les commentaires et posts associés par tags créés par l'auteur? Je ne suis pas sûr de savoir comment construire cet objet AR.
  • Comment trouver tous les commentaires et articles d'un auteur qui partagent un tag spécifique? Pour cela j'ai essayé @taggable = @author.tagging.joins(:tag).where(tags: {name: @tag_name}), mais je ne peux pas faire ça.

Merci

Répondre

0

Si vous utilisez la pierre précieuse acts_as_taggable, alors il est facile de trouver des documents en utilisant tagable tagged_with utilitaire.

##get the author 
@author = Author.find params[:id] 
##get the authors category/tags 
cat = @author.tags 
##find all post/comments that are tagged with cat 
Author.includes(:post, :comments, :tags).tagged_with(cat,:any=>true)}.flatten.compact.uniq 

IF, vous n'utilisez pas :(acts_as_taggable, alors vous devez construire votre propre requête ... qui peut être comme ça ..

Author.includes(:post, :comments, :tags).where(tags: {taggable_type: 'Author',taggable_id: @author.id}).flatten.compact.uniq 
+0

Merci pour cette réponse. Malheureusement, je suis Je n'utilise pas acts_as_taggable et j'utilise les classes personnalisées que j'ai définies ci-dessus.J'espérais éviter d'utiliser cette gemme à des fins d'apprentissage.Toutes les idées comment faire ces requêtes sans la gemme? – jewnbug97

+0

Eh bien ... il y a des raisons pour lesquelles les gemmes sont faites. ..pour faciliter notre vie parce que quelqu'un a déjà fait cet effort que vous le faites à nouveau .... :). Vous devez faire une requête sql en utilisant taggable_type/id pour vérifier ... – Milind

+0

J'ai mis à jour mon anwser..check it out en mettant en œuvre vos modifications ... – Milind