Witam
Mam 3 tabele: posts,taggings,tags
przy czym:
post has_many tags
tag has_many posts
tagging belongs_to post,tag
Chcę skonstruować scope Post.find_by_tag, który by mi zwrócił wszystkie posty z przypisanym tagiem “tag1”. Jak zbudować polecenie SQL, które by to realizowało?
EDIT:
Przy pomocy wujka G udało mi się wysmażyć coś takiego, ale nie zwraca to tego, czego chcę, czyli rekordów tylko z tabeli Posts.
SELECT * FROM posts INNER JOIN (tags,taggings) ON (taggings.post_id=posts.id AND taggings.tag_id=tags.id) WHERE tags.name="akcja"
Nie do końca rozumiem, co chcesz osiągnąć. Nie możesz po prostu wklepać czegoś w stylu @posts = Tag.find_by_name('elo').posts? Jeśli powiązania masz poprawnie zrealizowane, to nie powinno być problemu.
W podanym przeze mnie rozwiązaniu Tag#find_by_name nawet nie rusza asocjacji Po prostu najpierw wyszukujesz tag po nazwie, a później wyświetlasz wszystkie należące do niego posty.
W jakiś sposób chyba musi, bo w bazie tabela tags nie ma pola “posts”
Poza tym chyba zapomniałem dodać, że to jest has_many :through, a nie zwykłe has_many. Co nie zmienia faktu, że rozwiązanie działa.