2011-08-11 6 views
5

私はレールにブログエンジンを書き、have_and_belongs_to_many関係を持つタグモデルとポストモデルを設定しました。タグの追加がうまくいけば、特定のタグを含むすべての投稿を検索するときに問題が発生します。Railsでのタグの実装:1つのタグで複数のアイテムを参照するには?

投稿Aにタグ "test"を追加し、投稿Bにタグ "test"を追加すると、 "test"という名前で異なるIDを持ち、両方とも異なる投稿を参照しています。ここで、パラメータ "tag"を取るコントローラアクションindexTagPostsがあり、そのタグを持つすべてのポストを見つけたら、他のタグが異なるIDを持っていて本当に関連付けられていないので、1つのポストしか返しません。どういうわけか新しいタグの追加を制限する必要がありますか、または関連するすべてのタグを異なる方法で操作する方法を操作する必要がありますか?ここで

は、パラメータ「タグ」に基づいて、関連するすべての記事をつかむことになっているコントローラのアクションです:

def indexTagPosts 

     @tag = Tag.find(params[:tag]) 
     @posts = @tag.posts.all 

end 

そしてここでは、タグを保存するアクションです:

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 

感謝冗長性や悪い言い訳のためにお詫び申し上げます。

答えて

9

誰もがhas_and_belongs_to_manyを使用するというアイデアを知りたがっていますが、これは管理が非常に難しいため、最初は簡単に思えます。より良いアプローチは、個々のリンクを管理してメタデータを簡単に追加できるため、has_many ..., :throughタイプの関係を持つことです。この時点で

class Post < ActiveRecord::Base 
    has_many :post_tags 
    has_many :tags, :through => :post_tags 
end 

class Tag < ActiveRecord::Base 
    has_many :post_tags 
    has_many :posts, :through => :post_tags 
end 

class PostTag < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :tag 
end 

タグのリンクの追加と削除は簡単です::

例えば

は、ここにあなたが見つけるパターンはかなり頻繁に発生し、シンプルな2ウェイは、中間モデルで参加しています

@post = Post.find(params[:post_id]) 

if (params[:tags].present?) 
    @post.tags = Tag.where(:name => params[:tags].split(/\s*,\s*/)) 
else 
    @post.tags = [ ] 
end 

has_manyリレーションシップマネージャは、必要に応じてPostTagアソシエーションモデルを作成、更新、または破棄します。答えを

class Post 
    def tags_used 
    self.tags.collect(&:name).join(',') 
    end 

    def tags_used=(list) 
    self.tags = list.present? ? Tag.where(:name => list.split(/\s*,\s*/)) : [ ] 
    end 
end 
+1

ありがとう:

一般的に、あなたが好きな分離器を使用してタグを検索して割り当てるためのユーティリティメソッドが含まれるようにPostモデルを進化させます。各タグをTagモデルの別のインスタンスとして実装しようとすると、どうすればよいのか分かりません。 – Chazu

+1

通常、タグ・モデルを持つポイントは、タグ付きのすべてのものを見つけることができるためです。各郵便ごとに異なるタグを持たせることは、その目的を打ち負かします。 – tadman

関連する問題