我希望在我的博客应用中添加标签。
我希望帖子没有,一个或多个标签。目前,我想将标签的选择限制为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?
我知道有插件和现有选项可用,但希望能够通过表格控制标签。我已经学过一些教程,但他们没有提供完整的解决方案。
答案 0 :(得分:1)
你可以尝试这个acts-as-taggable-on宝石,看railscast可能会给你更好的想法
答案 1 :(得分:0)
就个人而言,如果您只需要处理10个预定义的标签,那么请继续使用“最简单的可能工作的东西”,那么我可能会倾向于使用简单的序列化字段。
然而,当你想按标签搜索帖子时,这需要额外的努力并且对数据库造成不必要的负担(最简单的是LIKE查询,在大多数情况下涉及表扫描)。
所以,就个人而言,即使使用简单的标记系统,我也几乎总会得到一个只有tags
和id
的{{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
这将解决您的问题