2016-07-24 30 views
0

Ich habe zwei Modelle, Beiträge und Tags, mit einer Viele-zu-viele-Beziehung zwischen ihnen. Ich habe diese Beziehung mit einer posts_tags-Tabelle implementiert, die aus posts.post_id und tags.tag_id besteht.Rails 4 Join Abfrage über has_and_belongs_to_many Beziehung

Ich versuche, ein aktives Rekordobjekt aller Beiträge mit einem bestimmten Tag zu bekommen. Ich habe diese Arbeit mit dem Code:

posts_i_want = [] 
all = Post.all 
all.each do |x| 
    x.tags.each do |y| 
     if y.tag == params[:tag] 
      posts_i_want.push(x.id) 
     end 
    end 
end 
@posts = Post.where(id: posts_i_want) 

Aber aus der Lektüre zu diesem Thema scheint es ein viel besserer Weg ist, es zu tun. Etwas ähnliches wie:

@posts = Post.joins("INNER JOIN posts_tags ON posts.post_id = posts_tags.post_id INNER JOIN tags ON posts_tags.tag_id = tags.tag_id WHERE tags.tag = #{params[:tag]}") 

oder

@posts = Post.joins(posts_tags: :tags).where(tag: params[:tag]) 

, aber ich war nicht erfolgreich in die richtige Art und Weise den Weg zur Arbeit. Ich hoffe, dass jemand, der mit Rubin auf Schienen experimentiert hat, vorschlagen kann, wie die Lösung aussehen könnte. Vielen Dank!

p.s. mit postgresql

Antwort

0

Können Sie diese bitte versuchen Sie

@posts = Post.joins(:posts_tags).where(posts_tags: { tag: params[:tag] }) 

EDIT: bei Ihnen iterativen Code suchen, um es Ihnen die post_tags beitreten nicht brauchen scheint. Sie brauchen eigentlich eine Tags

@posts = Post.joins(:tags).where(tag: params[:tag]) 
+0

Dank für den Versuch aussehen sollte! aber das gibt ein leeres activerecord Objekt zurück. Es stürzt jedoch nicht ab. –

+0

Aktualisiert meine Antwort –

-1

so kommen Ihre Abfrage wie

@posts = Post.joins(:posts_tags).joins(:tags).where(tag: params[:tag]) 

oder

@posts = Post.{name of relationship}.find_by(tag: params[:tag]) 
+0

Er muss nicht tatsächlich beitreten posts_tags obwohl, wie es aussieht, hat er eine hat viele durch Beziehung bereits, nur Join-Tags sollte mehr als ausreichen –