В зависимости от Ваших потребностей и стиля программирования, можно также использовать комбинацию нового метода класса и слияния. Из-за отсутствия лучшего простой пример, предположите, что Вам запланировали задачу для определенной даты, и Вы хотите копировать его на другую дату. Фактические атрибуты задачи не важны, таким образом:
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.
Мир.
Хороший вопрос, я несколько раз сталкивался с той же проблемой. Каждый раз я заканчивал это тем, что писал свой собственный 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 .. ..)
Вы можете приблизиться, сделав что-то вроде:
@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
индивидуально.
Пробовали ли вы отображать два разных набора результатов с их собственными пагинаторами и обновлять их через AJAX? Это не совсем то, что вам нужно, но результат похож.