Используя will_paginate с многоуровневыми моделями (направляющие)

В зависимости от Ваших потребностей и стиля программирования, можно также использовать комбинацию нового метода класса и слияния. Из-за отсутствия лучшего простой пример, предположите, что Вам запланировали задачу для определенной даты, и Вы хотите копировать его на другую дату. Фактические атрибуты задачи не важны, таким образом:

old_task = Task.find(task_id)
new_task = Task.new(old_task.attributes.merge({:scheduled_on => some_new_date}))

создаст новую задачу с :id => nil, :scheduled_on => some_new_date, и все другие атрибуты то же как исходная задача. Используя Task.new, необходимо будет явно звонить, сохраняют, поэтому если Вы хотите сохраненный автоматически, изменяете Task.new на Task.create.

Мир.

8
задан John Topley 7 July 2009 в 11:18
поделиться

3 ответа

Хороший вопрос, я несколько раз сталкивался с той же проблемой. Каждый раз я заканчивал это тем, что писал свой собственный sql-запрос на основе sql-объединений (он отлично работает с sqlite и mysql). Затем вы можете использовать разбиение на страницы, передавая результаты ( http://www.pathf.com/blogs/2008/06/how-to-use-will_paginate-with-non-activerecord-collectionarray/ ). Не забудьте выполнить запрос для подсчета всех строк.

Некоторые строки кода (не проверены)

my_query = "(select posts.title from posts) UNIONS (select profiles.name from profiles)"
total_entries = ActiveRecord::Base.connection.execute("select count(*) as count from (#{my_query})").first['count'].to_i

results = ActiveRecord::Base.connection.select_rows("select * from (#{my_query}) limit #{limit} offset #{offset}")

Это перебор? Возможно, но у вас минимальное количество запросов, и результаты согласованы.

Надеюсь, это поможет.

Примечание: если вы получаете значение смещения из параметра http, вам следует использовать sanitize_sql_for_conditions (например: внедрение sql .. ..)

7
ответ дан 5 December 2019 в 19:02
поделиться

Вы можете приблизиться, сделав что-то вроде:

@profiles, @groups = [Profile, Group].map do |clazz|
  clazz.paginate(:page => params[clazz.to_s.downcase + "_page"], :order => 'name')
end

Это будет разбиваться на страницы с использованием параметров страницы profile_page и group_page . Вы можете получить вызов will_paginate в представлении, чтобы использовать правильную страницу, используя:

<%= will_paginate @profiles, :page_param => 'profile_page' %>
....
<%= will_paginate @groups, :page_param => 'group_page' %>

Тем не менее, я не уверен, что есть огромное преимущество по сравнению с настройкой @groups и ] @profiles индивидуально.

1
ответ дан 5 December 2019 в 19:02
поделиться

Пробовали ли вы отображать два разных набора результатов с их собственными пагинаторами и обновлять их через AJAX? Это не совсем то, что вам нужно, но результат похож.

0
ответ дан 5 December 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: