一个表,一列(RSS提要阅读器中的“标题”)。在前端,我想要一个文本区域,我可以在其中输入以逗号分隔的搜索词列表,一些多词,如“政治”:
rajoy, pp, "popular party", "socialist party", etc
这可以存储为单独搜索模型的一部分,也可以存储为“类别”或“故事”模型中的关键字列,因此可以使用前端的不同术语对其进行编辑和改进,
在RSS阅读器中,有一系列链接,每个故事或类别一个,在被点击时返回包含一个(或多个)搜索词的标题从存储列表中。
在更高版本中,最好找到包含列表中几个术语的标题,但让我们从简单开始。
一直在阅读关于postgres,rails,不同类型的搜索和查询的大量阅读,但似乎无法找到我想要的内容,我理解的基本上是“搜索'标题'列反对此搜索词列表”
听起来它可能是一个数组的东西,更多的是与Rails中的控制器而不是postgres,或循环通过一个带有一些多字词的巨型OR查询,但我不确定。
有没有人有关于如何开始的更好的指示?
答案 0 :(得分:1)
如果这是特定于用户的,我将从一个用户模型开始,该模型负责持久保存每组唯一的搜索术语。认为登录或会话。
假设您使用之前提到的Category方法,并假设有一个名为name
的列。每个搜索项将作为单独的实例存储在数据库中。想想标签。
包含来自存储列表中的一个(或多个)搜索字词的标题
由于每个类别都有很多术语,并且所有查询都是OR查询,因此加入用户和类别的模型,存储搜索词是合适的。
我还假设你有一个包含实际故事的故事模型,尽管这可能不会在数据库中保留。我预测你的故事模型有一个标题和一个正文。
rails generage model SearchTerm query:string user:references category:references && rake db:migrate
在您现有的用户和类别模型中,您将添加:
# app/models/user.rb
has_many :search_terms
has_many categories, through: :search_terms
# app/models/category.rb
has_many :search_terms
has_many :stories
这将自动使您能够这样做:
@user = User.last # this is in the console, just to demonstrate
@category = Category.find_by_name("politics")
@user.search_terms.create {query: "rajoy", category: @category}
@user.search_terms.create {query: "pp", category: @category}
@user.search_terms.where(category_id: @category.id).pluck(:query)
-> ['rajoy', 'pp']
您希望对控制器(可能是类别控制器)执行的操作是解析文本字段并更新数据库中的搜索项。如果您想要逗号和空格来分隔字段,您可以这样做:
@user.search_terms.where(category: @category).delete_all
params[:search_term][:query].split(", ").map{|x| x.gsub("\"", "")}.each do |term|
@user.search_terms.create({category: @category, query: term})
end
就个人而言,我使前端使用起来不那么复杂,比如只需要逗号,没有引号,或只需要空格和引号。
对于最后的结局,要显示在其标题中包含搜索词的故事:
Story.where(@user.search_terms.where(category: @category).pluck(:query).map { |term| "heading like '%#{term}%'" }.join(" OR "))
我建议使用pg_search gem而不是尝试维护这样的复杂查询。
注意:我确定此处有错误,因为我无法真正创建整个应用来回答您的问题。我希望这可以帮助您开始实际需要做的事情。我鼓励你在完成这个工作时发布有一些代码的问题。