在Rails中为帖子添加标签/类别?

时间:2012-09-28 06:17:15

标签: ruby-on-rails ruby ruby-on-rails-3

我希望在我的博客应用中添加标签。

我希望帖子没有,一个或多个标签。目前,我想将标签的选择限制为10个预定义标签。

我应该创建一个模型:

   post_id, tag_name
   1, sport
   1, news
   1, fun
   2, sport
   3, news

或更广泛的表格:

   post_id, tag_sport, tag_special
   1,Yes,No,...

或在帖子表中包含所选标签:

   post_id, post_body, post_tags
   1, lorem ipsum, sport|news|fun

表格看起来怎么样?

   Free textbox separated by commas? Checkbox?

我知道有插件和现有选项可用,但希望能够通过表格控制标签。我已经学过一些教程,但他们没有提供完整的解决方案。

4 个答案:

答案 0 :(得分:1)

你可以尝试这个acts-as-taggable-on宝石,看railscast可能会给你更好的想法

答案 1 :(得分:0)

就个人而言,如果您只需要处理10个预定义的标签,那么请继续使用“最简单的可能工作的东西”,那么我可能会倾向于使用简单的序列化字段。

然而,当你想按标签搜索帖子时,这需要额外的努力并且对数据库造成不必要的负担(最简单的是LIKE查询,在大多数情况下涉及表扫描)。

所以,就个人而言,即使使用简单的标记系统,我也几乎总会得到一个只有tagsid的{​​{1}}表,然后是name之间的关系标签和可标记实体:

has_and_belongs_to_many

class Post < ActiveRecord::Base has_and_belongs_to_many :tags

Tag

当然,这意味着必须编写迁移来创建适当的连接表,例如:

class Tag < ActiveRecord::Base

  attr_accessible :name

  has_and_belongs_to_many :posts

  validates :name, presence: true, uniqueness: {case_sensitive: false}  

这样,数据库架构也保存在normal form

要按标签搜索,它会缩小为:

class CreatePostsTags < ActiveRecord::Migration
  def change
    create_table :posts_tags do |t|
      t.references :post, null: false
      t.references :tag, null: false
    end
  end
end

(在实践中,您需要一个Tag.find_by_name('news').posts 方法Tag.named(name) strip.downcase。)

至于表单,同样,我最终可能最简单的事情就是纯文本字段,其中标记用逗号分隔(因此逗号字符不是标记名称中的有效字符)。或者,如果您不允许标记名称中的空格,则可以将空格用作分隔符。

答案 2 :(得分:0)

这里你不会得到一个完整的解决方案。所以不是代码分配器。

这里有一个典型的n到m关系。帖子可能有很多标签(限制最多10个标签与此无关) - 标签可以是许多帖子的一部分。

通过使用另外两个表来建模n到m关系:1表示相关模型(标签),1表示保存关系。

这会给你(假设你的帖子表被命名为帖子)

posts_tags如下所示:

id
post_id
tag_id

表格tags

id
tagname

然后通过has_and_belongs_to_many

在模型中描述关系

如果帖子只能有一个标签 - 您可以使用1对多关系来简化此操作。

对于设计并给出少量标签,我会使用一堆复选框。但这取决于你。您可以在网上找到n:m可视化的示例。

答案 3 :(得分:0)

我的建议是使用书籍与标签之间的habtm关系。

   class < books
     has_and_belongs_to_many :tags
     validates :no_of_tags


     def no_of_tags
        if self.tags.length < 4 #your choiche
          false
        end
     end
   end


   class < tags
     has_and_belongs_to_many :books
   end

另外创建一个table books_posts

这将解决您的问题