Базовый дизайн для расширенного (многошагового) поиска в Rails - PullRequest
1 голос
/ 04 января 2012

Основная часть приложения, над которым я работаю, позволяет пользователю исследовать сложный набор данных, постепенно добавляя поисковые термины.Например, вы можете начать с поиска в свободном тексте, затем постепенно добавлять (или удалять) некоторые фасетные условия поиска, перемещать ползунок, чтобы ограничить некоторое измерение возвращаемых результатов и т. Д.

Концептуально, кажется,Мне, что пользователь постепенно определяет набор ограничений.Эти ограничения используются для поиска в наборе данных, а рендеринг результатов предоставляет возможности пользовательского интерфейса для добавления дополнительных уточнений поиска.Поэтому, создавая это в Rails, я думаю, что одной из моделей будет текущий набор ограничений поиска, а действия контроллера добавляют или удаляют условия ограничения из этой модели.

Предполагая, что это разумный подход (что является частью моего вопроса!), я не уверен, как подойти к этому в Rails, так как поиск является эфемерным, а не постоянным объектом.Я мог бы сохранить модель ограничений в хранилище сеансов, но это довольно сложный объект, который можно поместить в cookie.С другой стороны, я мог бы сохранить модель ограничений в базе данных, но тогда у меня возникнет проблема GC, поскольку база данных заполняется моделями ограничений из предыдущих сессий.

Итак: как лучше построитькомплексное состояние взаимодействия в Rails?

Ответы [ 2 ]

0 голосов
/ 04 июня 2014

Мне пришлось решить эту проблему для нескольких приложений, поэтому я написал небольшой гем с DSL для описания этих поисков:

https://github.com/fortytools/forty_facets

0 голосов
/ 04 января 2012

Вот несколько указателей

  • создайте класс XxxSearch с аксессорами для всех аспектов поиска: ключевые слова, категории, теги и т. Д. Этот класс должен быть совместим с ActiveModel, и его экземпляры будут использоваться вместе с form_for @xxx_search. Этот класс не предназначен для сохранения только для временного хранения параметров поиска и любой связанной логики. Он может даже выступать в качестве предъявителя для данных: @xxx_search.results или реализовывать проверки данных поиска для каждого шага фасетирования.
  • постепенно повторно отправьте форму с помощью мастера или даже вставки данных в большом формате.
  • всегда отправляет запрос через GET, как таковой:
    • поиск в закладке
    • Вы можете легко связать параметры с ссылками на нумерацию страниц, например: params_for(params[:search].merge(:page => 3))
    • вам НЕ нужно использовать сессию, данные передаются через GET-параметры, например:
      • можете продолжать использовать сессионное хранилище cookie
      • избавляет вас от многих головных болей, когда последний поиск сохраняется, и пользователь ожидает новый контекст поиска (я говорю это из опыта)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...