Пагинация с порядком, определяемым объединенной моделью в Rails - PullRequest
0 голосов
/ 13 октября 2010

В настоящее время у меня есть следующая проблема в приложении Rails (Rails 2.3.5):

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

Книга и Автор - конкретные модели, соответствующие таблицы - Ресурсы и Люди.Соответствующей частью схемы является (я немного урезал модель):

  create_table "people", :force => true do |t|
      t.string   "sur_name"
      t.string   "pre_name"
      ...
      t.string   "type"
    end

  create_table "people_ressources", :id => false, :force => true do |t|
      t.integer  "ressource_id"
      t.integer  "person_id"
    end

  create_table "ressources", :force => true do |t|
      t.string   "type"
      t.string   "title"
    end

Чтобы показать список книг, я использовал следующий пагинатор:

@books = Book.paginate(
             :order => 'title', :per_page => 15, :page => params[:page])

Мой вопрос теперь таков: как должен быть устроен нумератор страниц, чтобы книги упорядочивались не по названию, а сначала по автору (== персона) sur_name?И если это не так легко сделать, какая конструкция позволит хранить книги и авторов как отдельные объекты, но позволит получить paginator с заданным порядком?

1 Ответ

1 голос
/ 13 октября 2010

Учитывая, что у вас есть несколько авторов для книги, вам нужно будет решить, каким образом вы определяете, кто является автором, чье имя следует использовать для заказа списка книг.

Вы можете добавить ассоциацию has_one :main_author, :class_name => 'Author' к вашему классу Book, определенному по вашему усмотрению (возможно, в people_ressources есть поле основного автора или просто вы используете первого доступного автора:

has_one :main_author, :through => :author_books, :order => 'sur_name'

Наличие этой has_one ассоциации означает, что вы можете включить это в нумерацию страниц и порядок в отношении sur_name там:

@books = Book.paginate(:order => "#{Author.table_name}.sur_name", 
                       :per_page => 15, 
                       :page => params[:page])
...