【问题标题】:Modeling Keywords and Phrases in Rails在 Rails 中建模关键字和短语
【发布时间】:2012-02-15 15:03:20
【问题描述】:

我想创建一个关键字表,将单词存储在字符串中(来自带有空格的短语),如果用户输入一个短语,它会在短语表中添加对关键字 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 关键字的词组

我的目标是避免任何表中出现重复行,这是否令人费解?您能否提出一个更好的设计,即 rails 的处理方式?

【问题讨论】:

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


    【解决方案1】:

    您的描述与标签的概念非常相似,因此您可以使用任何现有的tagging libraries,和/或研究它们的结构以获得可靠的解决方案。

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

    这些工具只需很少的代码就可以将@domain.tags 添加到任何记录中。一些库还允许您定义您想要调用标签的内容 - 因此,如果您想将它们称为关键字,您可以这样做,并且可以调用 @domain.keywords@domain.phrases 等,就像在您的示例中一样。

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

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

    【讨论】:

    • 使用acts_as_taggable_on 的优点和缺点是什么?如elhu 所证明的那样,在一个简单的有很多通过关联的情况下使用acts_as_taggable_on?在第二个注意事项上。如果有一个可以将 url 作为输入的 gem,然后抓取该 url 抓取内容并将其解析为关键字以在我的应用程序中提供建议,那就太好了。您是否知道任何允许您执行此操作的 gem 或 API?到目前为止,我发现 github.com/apneadiving/SemExtractor#readme 它使用 textwise 从网站获取文本,但它们的许可证不允许您与网络爬虫/蜘蛛集成。
    • 我只是指出您所要求的与标签概念的相似之处,以防您真正想要的是标签或功能等价物。专业人士不必自己实施(和维护),而是利用他人的工作。
    【解决方案2】:

    当您设计应用程序时,您将拥有三个模型,如下所示:

    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
    

    干杯。

    【讨论】:

    • 感谢您写出这些课程。 @domain.phrases 会按照保存顺序返回关键字列表吗?我正在尝试跟踪原始短语,以便我可以告诉我的应用程序出去并运行所请求的搜索短语。
    • 没关系,我在您的帖子中错过了这一点“通过此设置,您可以按照您在问题末尾描述的方式访问域的短语和关键字的短语”
    • 默认情况下,它会按 ID 升序排序,但您可以使用范围轻松更改此行为。网上有很多关于这方面的文档。但是,我不确定将单独存储的单词列表中的句子放在一起是否会表现得非常好。我认为,如果您有时间,您应该进一步研究他的回答中提供的一些解决方案 normalocity。
    • 我想我可能会选择acts_as_taggable_on...我现在正在检查它是否支持包含多个单词的标签。我不想用连字符代替空格。
    猜你喜欢
    • 2012-06-15
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多