ограничение и порядок ввода не работают

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я использую will_paginate для вложенных заметок в представлении contact show. Контроллер контактов выглядит следующим образом:

     @contact = Contact.find(params[:id], :include => :notes)
@notes = @contact.notes.paginate(:page => params[:page], :per_page => 5, :order => "created_at ASC")
 

Отображение контактов имеет <%= will_paginate @notes %> тег. Это работает, но порядок сортировки неверен, он показывает все 6 заметок вместо 5, а нумерация страниц вверху перевернута, это «следующий, 2, 1, предыдущий» вместо «предыдущий, 1,2, следующий»???

Ответ №1:

Вы пробовали перемещать порядок в область видимости?

У вас может быть область в вашей модели, например

 scope :order_by, lambda { |o| { :order => o } }
 

А затем напишите свою строку разбиения на страницы как

 @notes = @contact.notes.order_by("created_at ASC").paginate(:page => params[:page], :per_page => 5)
 

Комментарии:

1. Почему вы обертываете order область вместо того, чтобы вызывать ее напрямую ( @contect.notes.order("created_at ASC").paginate(....) )?

2. Хорошая точка зрения, Дэн. Это остаток от моих Rails 2.3 дней. Вы совершенно правы. Я думаю, это зависит от того, какую версию Rails использует Джон.

Ответ №2:

Моей первой мыслью было, что :include => :notes это может сбить с толку will_paginate. Вы пытались оставить это?

Комментарии:

1. К сожалению, это не имеет никакого значения.

Ответ №3:

Вы можете сделать это:

 @notes = @contact.notes.paginate(:page => params[:page], :per_page => 5, :order => "notes.created_at ASC")

class Contact < ActiveRecord::Base
  has_many :notes,:order => "...." #remove this order option if you did
end

class Note < ActiveRecord::Base
  default_scope :order => "..." # remove this order option if you did
end
 

Ответ №4:

Вы указали :order => "created_at ASC" метод paginate вместо активного объекта, который вы хотите каким-то образом отсортировать. Я не смог найти точную точку в will_paginate драгоценном камне, но держу пари, что вспомогательный метод просмотра will_paginate проверяет порядок, чтобы увидеть, идет ли он слева направо или справа налево.

Модифицированная версия ответа Симмо, включающая предложение Дэна Сиверса, должна быть правильной:

@notes = @contact.notes.order("created_at ASC").paginate(:page => params[:page], :per_page => 5)

Ответ №5:

Как глупо!! Наконец-то обнаружена проблема, элементы имели значение «float: right», что привело к обратному порядку….