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
Dank für den Versuch aussehen sollte! aber das gibt ein leeres activerecord Objekt zurück. Es stürzt jedoch nicht ab. –
Aktualisiert meine Antwort –