2014-02-09 2 views
0

Похоже, что я могу использовать тот или иной, но не тот, у кого есть пример того, как это сделать? Проблема в том, что для того, чтобы использовать will_paginate, я должен использовать метод поиска в моделиКак использовать фильтры will_paginate AND и Tire (Elastic Search)

Item.search("test", :page => 1, :per_page => 20) 

но для того, чтобы использовать фильтры, я должен использовать Тир прямо:

search = Tire::Search::Search.new("items") 
search.filter :term, :selected => true 

Но Я не могу понять, как это сделать. Спасибо за любой совет.

ответ

0

Я еще не использовал (а) эту библиотеку, но насколько я могу разбираться в исходном коде, поиск Model # и Tire :: Search :: Search должен быть таким же. Если вы посмотрите на исходный код модели # поиск делает это (сводится к соответствующим частям):

def search(*args, &block) 

    query, options = args 

    s = Tire::Search::Search.new(options.delete(:index), options) 

так вариантов просто передал через к инициализаторе Тир :: Поиск :: Поиск.

Но это только создает объект. Шины :: Поиск :: Поиск кажется внутренне использовать термины size и from вместо per_page и page. Таким образом, приведенный выше код продолжает так:

page  = options.delete(:page) 
    per_page = options.delete(:per_page) || Tire::Results::Pagination::default_per_page 

    s.size(per_page.to_i) if per_page 
    s.from(page.to_i <= 1 ? 0 : (per_page.to_i * (page.to_i-1))) if page && per_page 

так что кажется from работает отличается от page (в то время как size и per_page похожи). from - абсолютная позиция. (Я не знаю, что именно Tire :: Результаты :: Pagination :: default_per_page добавляет здесь, возможно, некоторые значения по умолчанию, которые могут быть установлены.)

Чтобы прийти к выводу, мое обоснованное предположение состояло в том, что что-то вроде этого должно работать для вас:

search = Tire::Search::Search.new("items", size: 20, from: 0) 

, где для других страниц позиции вы бы вычислить (per_page * (страница - 1))

Смежные вопросы