我想创建一个关键字表来存储字符串中的单词(来自带空格的短语),如果用户输入短语,则会在短语表中添加对关键字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
关键字的所有短语我的目标是避免任何表中的重复行,这是错综复杂的吗?你能否建议一个更好的设计,这是做事的方式?
答案 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
干杯。