2016-09-19 3 views
0

So unten meine Modelle sind:Active Abfragen über mehrere verbindet

post.rb

class Post < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, through: :taggings 
    has_many :collectables 
    has_many :collections, through: :collectables 
end 

tagging.rb

class Tagging < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :tag, counter_cache: :posts_count 
end 

tag.rb

collectable.rb

class Collectable < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :collection, counter_cache: :posts_count 
end 

collection.rb

class Collection < ActiveRecord::Base 
    has_many :collectables 
    has_many :posts 
end 

Eine Sammlung viele Beiträge hat, und ein Beitrag viele Tags hat. Jetzt versuche ich eine Suchleiste zu erstellen, die nach Collections von Posts suchen, die bestimmte haben Tags (tag.name ist der Suchbegriff). Zum Beispiel hat Collection 1 einen Post mit dem Tag #cat. Wenn der Benutzer nun nach "Katze" sucht, wird Sammlung 1 in den Ergebnissen angezeigt. Ich bin nicht sicher, wie die Abfrage aussehen sollte, um dies zu ermöglichen.

def self.search(search) 
    Collection.joins(:posts) ... ? 
end 
+0

'Collections.joins (Beiträge:: Tags) .where (Tags: {name: search_term})' – omnikron

Antwort

1

versuchen Sie dies:

def self.search(search) 
    Collection.includes(posts: :tags).where(tags: {name: search}) 
end 
-1

Try This

def self.search(search) 
    Collection.joins(posts: :tags).where({tags: {name: search}}) 
end 

Sie enthält verwenden können, eager_load und schließt sich, aber wenn Sie schließt sich dann nur wird es diese Sammlungen nehmen, die die haben Beiträge in allen anderen Fällen, es wird alle Sammlungen, die die Beiträge haben und die nicht die Beiträge haben.