will_paginate без использования activerecord - PullRequest
1 голос
/ 17 февраля 2010

Прошу прощения, если это тривиальный вопрос или мое понимание рельсов слабое.

У меня в контроллере 2 действия: index и fine_data.

Индекс выбирает и отображает все данные из таблицы базы данных.

fine_data отсеивает ненужные данные с помощью регулярных выражений и возвращает подмножество данных.

Контроллер выглядит так:

def index
    Result.paginate :per_page => 5, :page => params[:page], :order => 'created_at DESC'
end

def refine_data
   results = Result.all
   new_results = get_subset(results)
   redirect_to :action => 'index'
end

Я бы хотел перенаправить действие fine_data в то же представление (индекс) с new_results.

Поскольку new_results не из таблицы (или модели) базы данных, как мне построить свой пагинат?

Ответы [ 4 ]

2 голосов
/ 20 февраля 2010

Мне не удалось заставить will_paginate работать, создав собственный метод поиска. Я был почти успешным, но не совсем.

Вот что я пробовал: В контроллере:

def refine_data
 Result.paginate_refined_data :per_page => 5, :page => params[:page], :order => 'created_at DESC', :exclude =>"somestring"
end

В модели:

def find_refined_data(args)
  exclude_string = args[:exclude];
  new_results = do_some_work_and_exclude_records(@results,exclude_string)
end

will_paginate столкнулся с проблемой передачи мне дополнительного параметра: исключить, которого он не понял.

Самым простым решением для меня было создание собственного объекта WillPaginate :: Collection.

Итак, вот как моя теперь работает:

#The method name does not cause will_paginate to intercept and try to do its magic.
def new_find_refined_data(args)
  exclude_string = args[:exclude];
  new_results = do_some_work_and_exclude_records(@results,exclude_string)
  @entries = WillPaginate::Collection.create(1, args[:per_page]) do |pager|
  # inject the result array into the paginated collection:
  pager.replace(new_results)

  unless pager.total_entries
    # the pager didn't manage to guess the total count, do it manually
    pager.total_entries = new_results.length
  end
end

end

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

2 голосов
/ 17 февраля 2010

Как я писал в своем ответе на Сортировка по алгоритму ранжирования с использованием will-paginate , можно использовать собственный метод поиска для упорядочения данных.

Может использоваться аналогично для фильтрации нежелательных данных, так как вам просто нужно вернуть набор данных. Изменяя имя вашего refine_data на что-то вроде find_refined_data, вы можете использовать

Result.paginate_refined_data :per_page => 5, :page => params[:page], :order => 'created_at DESC'

в вашем index методе. (Конечно, вам нужно вернуть набор записей вместо перенаправления на действие index)

BTW Вы также можете использовать метод paginate_by_sql , если вы можете указать свой фильтр как запрос SQL. Это, вероятно, более эффективно, чем захват всех записей и выполнение с ними регулярных выражений. Но я думаю, более сложный.

0 голосов
/ 15 апреля 2010

Еще одной альтернативой может быть создание named_scope для вашего уточненного набора результатов. Можете ли вы сформулировать свою бизнес-логику "get_subset" в виде команд в стиле базы данных?

Если это так, вы можете реконструировать свой искатель как named_scope (с этими условиями) например:

named_scope :blue_things, :conditions => {:colour => 'blue'}

, а затем просто вызовите paginate:

Result.blue_things.paginate :per_page => 5, :page => params[:page]
0 голосов
/ 28 февраля 2010

Я не уверен насчет других ответов - вы, возможно, захотите перенести этот метод в класс вашей модели.

Но отвечая на твой вопрос. Способ показать то же представление, что и другое действие, заключается не в перенаправлении, а в использовании:

render :action => :index
...