【问题标题】:Rails Search One Column On Multiple Saved Terms (Saved Searches In Model)Rails 在多个保存的术语上搜索一列(模型中的保存搜索)
【发布时间】:2015-12-25 00:58:56
【问题描述】:

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

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

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

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

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

一直在阅读有关 postgres、rails、不同类型的搜索和查询的大量信息,但似乎找不到我想要的,我理解这基本上是“针对此搜索词列表搜索‘标题’列” .

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

有没有人对如何开始有更好的指导?

【问题讨论】:

    标签: ruby-on-rails postgresql search rss


    【解决方案1】:

    用户

    如果这将是特定于用户的,我将从负责保存每组唯一搜索词的用户模型开始。考虑登录或会话。

    假设您使用前面提到的 Category 方法,并假设有一个名为 name 的列。每个搜索词都将作为单独的实例存储在数据库中。想想标签。

    包含存储列表中的一个(或多个)搜索词的标题

    类别

    由于每个类别都有许多术语,并且所有查询都将是 OR 查询,因此连接用户和类别的模型,存储搜索词是合适的。

    我还假设您有一个包含实际故事的 Story 模型,尽管这可能不会保留在数据库中。我预测你的故事模型有一个标题和一个正文。

    终端控制台

    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']
    

    控制器

    您希望对控制器(可能是 Category 控制器)执行的操作是解析文本字段并更新数据库中的搜索词。如果你想用逗号和空格分隔字段,你可以这样做:

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

    注意:我确定这其中存在错误,因为我无法实际创建整个应用程序来回答您的问题。我希望这可以帮助您开始实际需要做的事情。我鼓励您在解决此问题时发布包含一些代码的问题。

    参考

    【讨论】:

    • 嗯,一个有趣的开始,安迪,谢谢。让我先考虑一下,我会在今晚晚些时候更新。
    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多