2012-09-28 42 views
0

我正在尋找添加標籤到我的博客應用程序。爲Rails中的帖子添加標籤/類別?

我希望帖子有沒有,一個或多個標籤。目前,我想限制標籤的選擇爲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? 

我知道有插件和現有的選項可用,但希望能夠通過表控制標籤。我遵循了一些教程,但他們沒有提供完整的解決方案。

回答

1

你可以試試這個acts-as-taggable-on寶石,手錶railscast可能會給你更好的主意

+0

完全同意。最簡單的解決方案就是需要較少代碼的維護解決方案以及較少的維護。使用預先煮好的寶石,遵循指示並過上你的生活。 – rewritten

0

個人,並以「能夠工作的最簡單的事情」保持一致,如果你只需要處理,比如說,10預定義標籤,那麼我可能傾向於使用簡單的序列化字段。

但是,當您想要通過標記搜索帖子(最簡單的是LIKE查詢,大多數情況下涉及表掃描)時,這需要額外的努力並給數據庫帶來不必要的負擔。

所以,就個人而言,即使一個簡單的標籤系統,我幾乎總是有tags表只是idname,然後將標籤和加標籤實體之間的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 

這樣數據庫模式也保存在normal form

要通過標籤搜索,它減少到像:

Tag.find_by_name('news').posts 

(在實踐中,你會想要一個Tag.named(name)方法會strip.downcasename你。)

至於形式再次,我可能最簡單的事情就是一個純文本字段,其中標籤之間用逗號分隔(因此逗號字符不是標籤名稱中的有效字符)。或者,如果標籤名稱中不允許有空格,則可以使用該空格作爲分隔符。

0

你不會在這裏得到一個完整的解決方案。 SO不是代碼分配器。

你在這裏是一個典型的n到m的關係。一篇文章可能有許多標籤(限制最多10個標籤與此無關),而標籤可能是許多帖子的一部分。

n到m關係通過使用2個附加表來建模:1爲相關模型(標記),另一個用於保存關係。

這給你(假設你的職位表名爲職位)

posts_tags,看起來像這樣:

id 
post_id 
tag_id 

和一張桌子tags

id 
tagname 

的關係是那麼在型號中描述通過has_and_belongs_to_many

如果帖子只能有一個標籤 - 您可以使用一對多關係來簡化此操作。

對於設計和給定少量標籤,我只會使用一堆複選框。但這取決於你。您將在網上找到帶有軌道的n:m的可視化示例。

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

這將解決你的問題

相關問題