【问题标题】:Rails active record query for search filters用于搜索过滤器的 Rails 活动记录查询
【发布时间】:2013-03-01 04:44:25
【问题描述】:

查看 railscasts.com,我想知道 Ryan 如何为该站点实施搜索过滤器。如果搜索参数与数据库中的任何内容都不匹配,那么他将返回所有记录(例如,如果我们在 URL 中为搜索参数值键入无效参数,则返回所有记录,因为没有任何内容可供过滤)。如果它匹配数据库中的记录,他只返回那些匹配的记录。

是如何实现的?我可以只使用没有任何 gems/full-text-search 的 Active Record 吗?使用 Arel 的查询会是什么样子?

另外,他如何实现过滤器链接(我们进行搜索后页面顶部的链接)?他是否通过一次一个地删除搜索参数来解析每个搜索参数并在页面上生成链接?

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-3.2 rails-postgresql


    【解决方案1】:

    我没有看到 Railscasts.com 在无效过滤器(如搜索参数)时显示所有记录。当没有找到记录时,它会返回一个链接以查看所有剧集。例如,请参阅此链接: http://railscasts.com/episodes?utf8=%E2%9C%93&search= 它说:

    未找到任何剧集。查看所有剧集。

    但是,如果需要,您可以在这种情况下显示所有记录。这很容易。

      def index
        @records = []
        if params[:search].present?
          #YOUR SEARCH LOGIC and assign to @records. for example:
          @records = Episode.where(:title => params[:search])
        end
    
        unless @records.length
          @records = Episode.all  
        end
      end
    

    【讨论】:

    • 检查一下(过滤无效的“类型”)-railscasts.com/?type=AAAACCCCCDDDDD。有没有办法在一个查询中做到这一点?
    • 另外,如果 tag_id 参数错误,如何忽略过滤器?所以他能够确定 tag_id 参数显然是错误的(它应该是一个整数)并且忽略在搜索页面上创建过滤器链接。例如,请参阅此(将 tag_id 替换为整数进行比较) - railscasts.com/?tag_id=r&type=nbcaaaaaa
    • 啊,我现在明白了。有什么理由你必须在单个查询中这样做吗?我认为即时思考并不难。如果要检查过滤器是有效还是无效,则必须查询模型以检查该 type_id 是否存在。可能还有另一种模型。因此,当您看到该模型未返回任何内容时,您可以将其视为错误并查询您的实际情节以获取所有记录。
    • 我想知道我们是否可以构造一些东西来表示 - “如果它存在于数据库中,就给我这个,否则,给我那个参数的一切”。它应该在一个查询中,因为如果 tag_id 无效,它将被忽略。我不会想象 Ryan,首先访问数据库以查看 tag_id 是否存在,然后如果它不存在(或无效),则使用其余参数再次访问数据库,如果这些不返回任何内容,再次点击数据库以获取所有记录。那种似乎非常低效
    • 不,您不必这样做。如果您正确建模,您的连接查询将不会产生结果。在这种情况下,您必须查询所有可以轻松缓存的内容。查询是数据库在需要时不是低效的。对于可能无法重复使用的复杂查询,它可能效率低下。有时多个查询比单个复杂连接更快。您需要为此进行分析。
    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多