I’m writing a blog engine in rails, and have set up a tag model and a post model which have a have_and_belongs_to_many relationship. Tag addition works fine, the problem comes when looking for all posts with a specific tag:
If I add tag “test” to Post A, then add tag “test” to post B, there are two tag objects, both with name “test” but with different IDs, both referencing different posts. Now if I have a controller action indexTagPosts which takes the parameter “tag” and finds all posts with that tag, it will only return one post, since the other tag has a different ID and is not really associated. Should I be somehow restricting the addition of new tags, or should I be manipulating the way I pull all relevant tags differently?
Here is the controller action which is supposed to grab all relevant posts based on the parameter ‘tag’:
def indexTagPosts
@tag = Tag.find(params[:tag])
@posts = @tag.posts.all
end
And here is the action to save a tag:
def create
@post = Post.find(params[:post_id])
@tag = @post.tags.create(params[:tag])
respond_to do |format|
if @tag.save
format.html { redirect_to edit_post_path(@post),:notice => "Success" }
end
end
end
Thanks in advance and apologies for redundancy or bad wording.
I wish I knew where everyone got the idea to use
has_and_belongs_to_manybecause it’s a really difficult thing to manage, even if it seems simple at the start. The better approach is to have ahas_many ..., :throughtype relationship because you can manage the individual links and add meta-data to them easily.For instance, here is a simple two way join with an intermediate model, a pattern you’ll find occurs quite often:
Adding and removing Tag links at this point is trivial:
The
has_manyrelationship manager will create, update, or destroy thePostTagassociation models as required.Generally you’ll evolve the Post model to include a utility method for retrieving and assigning the tags using whatever separator you like: