在Rails中建模关键词和短语

时间:2012-02-15 15:03:20

标签: ruby-on-rails model has-many

我想创建一个关键字表来存储字符串中的单词(来自带空格的短语),如果用户输入短语,则会在短语表中添加对关键字ID的引用。

我认为表格应如下所示:

关键字:

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

有没有办法可以在rails中执行此操作,可能有has_many关系,这样我就可以通过传递@ domain.phrases来返回所有具有相同Domain_ID的短语列表和@ keyword.phrases来获取短语列出包含Keyword_ID

关键字的所有短语

我的目标是避免任何表中的重复行,这是错综复杂的吗?你能否建议一个更好的设计,这是做事的方式?

2 个答案:

答案 0 :(得分:1)

您所描述的内容与标记的概念非常相似,因此您可以使用已有的任何tagging libraries,和/或研究其结构以获得可靠的解决方案。

例如,acts_as_taggable_on gem的here is the migration,它可以让您了解其他人如何做到这一点,包括代码中的模型(以及模型之间的关系)。

这些工具只需极少的代码就可以将@domain.tags添加到任何记录中。有些库还允许您定义要标记的内容 - 因此,如果您想将其称为关键字,则可以执行此操作,并调用@domain.keywords@domain.phrases等等在你的例子中。

此外,如果最终目标是添加关键字以帮助搜索,那么有很好的搜索库和工具可以启用full text search(其中文字,标题等会自动为关键字编制索引)无需明确定义关键字。

真的取决于你想去的地方,但这些是你的几个方向。

答案 1 :(得分: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

干杯。