2010-02-17 5 views
1

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

У меня есть 2 действия в контроллере, index и уточнение_данных.

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

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

контроллер выглядит следующим образом:

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 

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

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

ответ

2

Мне не удалось получить 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

Как я писал в своем ответе Sort by ranking algorithm using will-paginate, для заказа данных можно использовать собственный метод поиска.

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

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

в методе index. (Конечно, вы должны возвращать набор записей вместо того, чтобы перенаправить к действию индекса)

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

+0

Veger, спасибо за предложения. Я поместил find_refined_data (search_string, page) в мою модель. я добавил следующую строку в мой контроллер действия refine_data Result.paginate_refined_data Params [: исключить], Params [: страницы] Однако я вижу сообщение об ошибке «параметра хэш ожидаемого» Я предполагаю, что paginate_refined_data нужны дополнительные параметры. Я не уверен, что. Мне также нужно передать в строку поиска мою модель с контроллера, кроме параметров will_paginate. Большое спасибо за помощь – truthSeekr

+0

Метод 'find' (и, следовательно, ваш) также требует одного аргумента (см. Http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263). Это хэш-список, из которого вы можете вычесть опции с помощью 'extract_options! 'Или что-то подобное, чтобы вы могли использовать их для своего собственного кода. – Veger

0

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

Но, отвечая на ваш вопрос. Путь, чтобы показать ту же точку зрения, как еще одно действие не перенаправлять, но использование:

render :action => :index 
0

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

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

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

, а затем просто позвонить постраничной на что:

Result.blue_things.paginate :per_page => 5, :page => params[:page] 
Смежные вопросы