Ruby on rails 3 Rails中丰富(多步骤)搜索的基本设计

Ruby on rails 3 Rails中丰富(多步骤)搜索的基本设计,ruby-on-rails-3,Ruby On Rails 3,我正在开发的应用程序的一个核心部分是允许用户通过逐步添加搜索词来探索复杂的数据集。例如,您可以从自由文本搜索开始,然后逐步添加(或删除)一些分面搜索词,移动滑块以约束返回结果的某些维度,等等 在概念上,在我看来,用户似乎是在增量地定义一组约束。这些约束用于搜索数据集,结果的呈现提供了UI启示,以添加进一步的搜索优化。因此,在Rails中构建这个模型时,我考虑让其中一个模型成为当前的一组搜索约束,并且控制器操作添加或删除该模型中的约束项 假设这是一种合理的方法(这是我问题的一部分!),我不确定如何

我正在开发的应用程序的一个核心部分是允许用户通过逐步添加搜索词来探索复杂的数据集。例如,您可以从自由文本搜索开始,然后逐步添加(或删除)一些分面搜索词,移动滑块以约束返回结果的某些维度,等等

在概念上,在我看来,用户似乎是在增量地定义一组约束。这些约束用于搜索数据集,结果的呈现提供了UI启示,以添加进一步的搜索优化。因此,在Rails中构建这个模型时,我考虑让其中一个模型成为当前的一组搜索约束,并且控制器操作添加或删除该模型中的约束项

假设这是一种合理的方法(这是我问题的一部分!),我不确定如何在Rails中实现这一点,因为搜索是一个短暂的,而不是持久的对象。我可以将约束模型保存在会话存储中,但将其编组到cookie中似乎是一个相当复杂的对象。另一方面,我可以将约束模型存储在数据库中,但是当数据库中充满了以前会话中的约束模型时,我会遇到GC问题

那么:如何最好地在Rails中建立一个复杂的交互状态呢?

这里有一些提示

  • 创建一个类
    XxxSearch
    ,其中包含所有搜索方面的访问器:关键字、类别、标记等等。这个类应该与ActiveModel兼容,它的实例将与@xxx\u搜索的
    form\u一起使用。这个类不仅仅是为了暂时保存搜索参数和任何相关逻辑而持久化的。它甚至可以充当数据的演示者:
    @xxx\u search.results
    ,或者为每个刻面步骤实现搜索数据验证
  • 通过,甚至在大表单上插入临时数据,以增量方式重新提交表单
  • 始终通过GET提交搜索,例如:
    • 该搜索可添加书签
    • 您可以轻松地将参数链接到分页链接,如:
      params\u for(params[:search].merge(:page=>3))
    • 您无需使用会话,数据通过GET params转发,如下所示:
      • 可以继续使用cookie会话存储
      • 当最后一次搜索被持久化并且用户期望一个新的搜索上下文时(我这样说是从经验中得出的),可以让您从很多麻烦中解脱出来

我不得不为几个应用程序解决这个问题,所以我写了一个带有DSL的小gem来描述这些搜索:


谢谢克莱夫。我同意创建包含完整搜索状态的动作URL作为参数将有一些优势。向导插件似乎强制执行表单数据提交的特定序列,而不是允许用户随机自愿接受任何可用约束。但对项目的其他部分可能有用。