Ruby on rails 在Rails中实现标记:如何用一个标记引用多个项目?
我正在用rails编写一个博客引擎,并建立了一个标签模型和一个帖子模型,这两个模型有一个have_和_-belient_-to_-many关系。标签添加工作正常,在查找带有特定标签的所有帖子时会出现问题: 如果我将标记“test”添加到帖子A,然后将标记“test”添加到帖子B,那么有两个标记对象,它们的名称都是“test”,但ID不同,都引用了不同的帖子。现在,如果我有一个控制器操作indexTagPosts,它接受参数“tag”,并找到带有该标记的所有帖子,它将只返回一篇帖子,因为另一个标记具有不同的ID,并且没有真正的关联。我应该以某种方式限制新标签的添加,还是应该以不同的方式操纵提取所有相关标签的方式 以下是控制器操作,该操作应根据参数“tag”获取所有相关帖子: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”,并找到带有该标记的所有帖子,它将只返回一篇帖子,因为另一个标记
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