Rails在多个保存条款上搜索一列(模型中保存的搜索)

时间:2015-12-25 00:58:56

标签: ruby-on-rails postgresql search rss

一个表,一列(RSS提要阅读器中的“标题”)。在前端,我想要一个文本区域,我可以在其中输入以逗号分隔的搜索词列表,一些多词,如“政治”:

rajoy, pp, "popular party", "socialist party", etc

这可以存储为单独搜索模型的一部分,也可以存储为“类别”或“故事”模型中的关键字列,因此可以使用前端的不同术语对其进行编辑和改进,

在RSS阅读器中,有一系列链接,每个故事或类别一个,在被点击时返回包含一个(或多个)搜索词的标题从存储列表中。

在更高版本中,最好找到包含列表中几个术语的标题,但让我们从简单开始。

一直在阅读关于postgres,rails,不同类型的搜索和查询的大量阅读,但似乎无法找到我想要的内容,我理解的基本上是“搜索'标题'列反对此搜索词列表”

听起来它可能是一个数组的东西,更多的是与Rails中的控制器而不是postgres,或循环通过一个带有一些多字词的巨型OR查询,但我不确定。

有没有人有关于如何开始的更好的指示?

1 个答案:

答案 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

Rails控制台

这将自动使您能够这样做:

@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而不是尝试维护这样的复杂查询。

注意:我确定此处有错误,因为我无法真正创建整个应用来回答您的问题。我希望这可以帮助您开始实际需要做的事情。我鼓励你在完成这个工作时发布有一些代码的问题。

参考