1

我正在寻找将标签添加到我的博客应用程序。

我希望帖子没有、一个或多个标签。现在,我想将标签的选择限制为 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 表中包含选择的标签:

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

表格看起来如何?

   Free textbox separated by commas? Checkbox?

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

4

4 回答 4

1

你可以试试这个作为可标记的宝石,观看railscast可能会给你更好的主意

于 2012-09-28T06:31:30.053 回答
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

另外创建一个表books_posts

这将解决您的问题

于 2012-09-28T07:36:36.283 回答
0

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

但是,当您想按标签搜索帖子时,这需要额外的工作并给您的数据库带来不必要的负载(最简单的是 LIKE 查询,在大多数情况下涉及表扫描)。

因此,就个人而言,即使使用简单的标记系统,我几乎总是会得到一个tags只有idand的表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}  

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

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 name。)

至于表单,我可能最终得到的最简单的东西只是一个纯文本字段,其中标签由逗号分隔(因此逗号字符不是标签名称中的有效字符)。或者,如果您不允许在标记名称中使用空格,则可以使用空格作为分隔符。

于 2012-09-28T06:43:26.673 回答
0

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

您在这里拥有的是典型的 n 到 m 关系。一篇文章可能有许多标签(最多 10 个标签的限制与此无关) - 一个标签可以是许多文章的一部分。

n 到 m 关系通过使用 2 个附加表来建模:1 个用于相关模型(标签),一个用于保存关系。

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

如下所示的表posts_tags

id
post_id
tag_id

还有一张桌子tags

id
tagname

然后通过模型在模型中描述该关系has_and_belongs_to_many

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

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

于 2012-09-28T06:47:40.120 回答