2012-02-15 38 views
0

我想創建一個將字詞存儲在字符串中的關鍵字表格(來自帶空格的短語),並且如果用戶輸入短語,它會在短語表中添加對關鍵字id的引用。建模Rails中的關鍵字和短語

我認爲表應該是這樣的:

關鍵字:

ID | Word 
----------- 
1, a 
2, keyword 
3, phrase 

域:

ID | Name 
----------- 
1, findme.org 

短語:

Phrase_ID | Keyword_ID | Domain_ID | Word_Weight 
----------- 
1, 1, 1, 0 
1, 2, 1, 1 
1, 3, 1, 2 

有沒有辦法,我可以在rai中做到這一點ls可能具有has_many關係,所以我可以通過傳遞@ domain.phrases來獲得一個短語,返回具有相同Domain_ID的所有短語的列表,並且@ keyword.phrases列出所有包含Keyword_ID的關鍵字的短語

我的目標是避免任何表中重複的行,這是令人費解?你能否提出一個更好的設計,這是軌道的做事方式?

回答

1

您所描述的內容與標籤的概念非常相似,因此您可以使用已有的tagging libraries中的任何一種,和/或研究其結構以獲得可靠的解決方案。

例如,here is the migrationacts_as_taggable_on的寶石,它會給你的人如何做其他本,包括模型(和模型之間的關係)在代碼的想法。

這些工具只需很少的代碼就可以將@domain.tags添加到任何記錄。有些圖書館還允許您定義要調用標籤的內容 - 因此,如果您想將它們稱爲關鍵字,則可以這樣做,並且可以調用@domain.keywords@domain.phrases等,就像您的示例中一樣。

此外,如果最終目標是添加關鍵字以幫助搜索,那麼有很棒的搜索庫和工具可以使full text search(其中文本,標題等自動爲關鍵字編制索引)而無需明確定義關鍵字。

真的取決於你想去的地方,但這些對你來說是幾個方向。

+0

使用acts_as_taggable_on優於簡單的優點和缺點有很多通過關聯如elhu所證明的那樣? 在第二個音符上。如果有一個gem可以輸入一個url,然後抓取該url,然後將其解析爲關鍵字以獲得我應用中的建議,那將會很不錯。你知道任何寶石或API允許你這樣做嗎?到目前爲止,我發現https://github.com/apneadiving/SemExtractor#readme它使用textwise從網站獲取文本,但他們的許可證不允許您與網絡爬蟲/蜘蛛集成。 – Arosboro 2012-02-15 16:26:02

+0

我只是指出了你所要求的與標籤概念的相似之處,以防你真正想要的是標籤或功能等價物。親不必自己實施(並維護它),而是利用其他人的工作。 – jefflunt 2012-02-15 20:00:33

0

當你設計你的應用程序,你將有三種型號,如下:

class Keyword < ActiveRecord::Base 
    has_many :phrases 
end 

class Domain < ActiveRecord::Base 
    has_many :phrases 
end 

class Phrase < ActiveRecord::Base 
    belongs_to :keyword 
    belongs_to :domain 
end 

有了這個設置,您可以訪問域的短語和關鍵字的短語,你描述你的問題的最終方式。 如果你想走得更遠,並訪問所有與特定關鍵字的域名,或者所有的關鍵字與特定的域,你會寫你的類如下:

class Keyword < ActiveRecord::Base 
    has_many :phrases 
    has_many :domains, through: :phrases 
end 

class Domain < ActiveRecord::Base 
    has_many :phrases 
    has_many :keywords, through: :phrases 
end 

class Phrase < ActiveRecord::Base 
    belongs_to :keyword 
    belongs_to :domain 
end 

然後,您可以訪問這些信息與如下:

@keyword.domains # All the domains matching with the keyword 
@domain.keywords # All the keywords for a specific domain 

乾杯。

+0

感謝您撰寫這些課程。 @ domain.phrases會按照它們保存的順序返回關鍵字列表嗎?我試圖跟蹤原始語句,以便我可以告訴我的應用程序出去並運行請求的搜索短語。 – Arosboro 2012-02-15 15:53:54

+0

沒關係我在你的文章中錯過了「使用這個設置,你可以在你的問題結束時以你描述的方式訪問一個域的短語和關鍵字的短語」 – Arosboro 2012-02-15 16:01:40

+0

默認情況下,它會按升序ID排序,但是你可以很容易地改變這種行爲使用範圍。網上有大量關於這方面的文檔。不過,我不確定從單獨存儲的單詞列表中將句子組合在一起表現會非常好。我認爲如果你有時間的話,你應該在他的答案中提供的一些正常解決方案中進一步挖掘。 – Elhu 2012-02-15 16:25:02