2017-01-14 50 views
1

У меня есть пользовательская модель (не сопоставление каких-либо таблиц в базе данных). Эта пользовательская модель является результатом объединения многих других данных таблицы. Я хочу использовать kaminari для paginate это.Kaminari: разбиение на страницы для пользовательской модели

, например:

def index 
    @custom_models = find_all_items # result is an array 
    render 
end 

И тогда я постраничной эти пункты зрения:

= paginate @custom_models 

Когда я запускаю это, я встречаю исключение:

неопределенный метод `total_pages' для массива: 0x007fb4dde63c70

Мой вопрос: как я могу использовать Kaminari для пользовательского файла модели.

@Edit я могу использовать Kaminari сейчас, просто использовать эту строку:

@custom_models = Kaminari.paginate_array(@custom_models) 
        .page(params[:page]).per(params[:per_page]) 

Но теперь я встречаю проблемы: потому что это пользовательская модель, я использую пользовательский запрос. Я использую raw sql query и paginate самостоятельно, используя ключевое слово offset и limit.

Например, я возвращаю 25 записей, а по умолчанию Kaminari отображает 25 записей на каждой странице, поэтому я могу видеть только 1 страницу. Я могу сделать запрос для возврата всех необходимых записей (например, 1000 записей), но я не знаю, как заставить Каминари понять это и показать мне достаточно страниц.

благодаря

ответ

2

Начнем с того, я полагаю, что fetch_all_items .а массив.

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

@custom_models = Kaminari.paginate_array(fetch_all_items).page(params[:page]) 

Но я считаю, что лучший способ - контролировать смещение/ограничение (разбиение на страницы) внутри вашей модели. Чтобы показать вам, как это сделать, было бы полезно иметь код, который производит fetch_all_items.

Вы можете найти более Kaminari wiki page

обновление - Hacky !!!

Итак, теперь мы ищем другую вещь.Не 100% наверняка это будет достаточно, но это должно быть способ пойти, если вы хотите пойти радикально и paginate в модели:

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

def fetch_all_items(page, per_page) 
    offset = page*per_page 
    items = SomeSqlMethod("select .... offset #{offset}, limit #{per_page}") # your sql statement 
    total_rows = SomeSqlMethod("select count(..) ....") # to get the total number of records 
    total_pages = (total_rows.to_f/per_page).ceil # to get the total pages 
    items.class.module_eval { 
     attr_accessor :total_pages, :current_page 
    } # to add some variables to make Kaminari happy 
    items.total_pages = total_pages 
    items.current_page = page 
    items # to return this 
end 

в контроллере, то вы должны иметь:

@custom_model = fetch_all_items(params[:page].to_i, params[:per_page].to_i) # cast to integer to avoid injections and misfunctions 

Помимо :total_pages, :current_page, Kaminari может также потребоваться некоторые другие переменные, как next_page, prev_page , Я не знаю. Используйте тот же блок, items.class.module_eval, чтобы ввести их.

+0

Я пробовал свой вариант. но я встречаю исключение в файле вида с именем: 'undefined method 'total_pages' для #Array: 0x007fb4daca5288'. О разбиении на страницы, я разбиваю страницы на запрос самостоятельно (используя ключевое слово offset и limit). –

+0

Если вы разбиваете на страницы в модели, то, вероятно, вам также нужно рассчитать количество страниц вручную. Пожалуйста, обновите свой вопрос более подробно, с точки зрения кода, на модели и уровне контроллера –

+0

Я обновил свой вопрос. Взгляни, пожалуйста. спасибо –

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

  • Нет связанных вопросов^_^