【问题标题】:Implementing tags in Rails: How to reference multiple items with one tag?在 Rails 中实现标签:如何用一个标签引用多个项目?
【发布时间】:2011-10-25 06:35:22
【问题描述】:

我正在用 Rails 编写一个博客引擎,并设置了一个标签模型和一个帖子模型,它们具有 have_and_belongs_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

提前致谢,并为冗余或措辞不当道歉。

【问题讨论】:

    标签: ruby-on-rails tags has-and-belongs-to-many


    【解决方案1】:

    我希望我知道每个人都从哪里得到使用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
    

    此时添加和删除标签链接很简单:

    @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 关联模型。

    通常,您将改进 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
    

    【讨论】:

    • 感谢您的回答。如果我要尝试将每个标签实现为 Tag 模型的单独实例,我不知道该怎么做。
    • 通常拥有一个标签模型的目的是让你可以找到所有用它标记的东西。为每个帖子设置不同的标签会破坏目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多