Ruby on rails 在Rails中实现标记:如何用一个标记引用多个项目?

Ruby on rails 在Rails中实现标记:如何用一个标记引用多个项目?,ruby-on-rails,tags,has-and-belongs-to-many,Ruby On Rails,Tags,Has And Belongs To Many,我正在用rails编写一个博客引擎,并建立了一个标签模型和一个帖子模型,这两个模型有一个have_和_-belient_-to_-many关系。标签添加工作正常,在查找带有特定标签的所有帖子时会出现问题: 如果我将标记“test”添加到帖子A,然后将标记“test”添加到帖子B,那么有两个标记对象,它们的名称都是“test”,但ID不同,都引用了不同的帖子。现在,如果我有一个控制器操作indexTagPosts,它接受参数“tag”,并找到带有该标记的所有帖子,它将只返回一篇帖子,因为另一个标记

我正在用rails编写一个博客引擎,并建立了一个标签模型和一个帖子模型,这两个模型有一个have_和_-belient_-to_-many关系。标签添加工作正常,在查找带有特定标签的所有帖子时会出现问题:

如果我将标记“test”添加到帖子A,然后将标记“test”添加到帖子B,那么有两个标记对象,它们的名称都是“test”,但ID不同,都引用了不同的帖子。现在,如果我有一个控制器操作indexTagPosts,它接受参数“tag”,并找到带有该标记的所有帖子,它将只返回一篇帖子,因为另一个标记具有不同的ID,并且没有真正的关联。我应该以某种方式限制新标签的添加,还是应该以不同的方式操纵提取所有相关标签的方式

以下是控制器操作,该操作应根据参数“tag”获取所有相关帖子:

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

提前感谢,并为冗余或糟糕的措辞表示歉意。

我希望我知道每个人在哪里都有了使用
的想法,因为这是一件很难管理的事情,即使一开始看起来很简单。更好的方法是使用
has_many…,:通过
类型关系,因为您可以轻松管理各个链接并向其中添加元数据

例如,这里有一个简单的双向连接和一个中间模型,您会发现这种模式经常出现:

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
有许多
关系经理将根据需要创建、更新或销毁
PostTag
关联模型

通常,您将改进Post模型,以包括一个实用方法,用于使用您喜欢的任何分隔符检索和分配标记:

 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

谢谢你的回答。如果我尝试将每个标记作为标记模型的一个单独实例来实现,我不确定该如何实现。通常,拥有标记模型的目的是让您可以找到所有标记了它的东西。每个帖子都有一个不同的标签会有点违背目的。
 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