метод "где" не работает при переключении с will_paginate на pagy gem в рельсах - PullRequest
0 голосов
/ 12 января 2020

Мой код will_paginate в контроллере:

@posts = Post.paginate(page: params[:page], per_page: 100).order('created_at DESC')

Мой код, который его заменил:

@pagy, @posts = pagy_countless(Post.order('created_at DESC'), items:5, link_extra: 'class="" style="color:#222222; margin:3px;"')

Мой взгляд на проблему:

<% @posts.where(user_id: current_user.friends).each do |post| %>

Сообщение об ошибке:

undefined method `where' for #<Array:0x00007f94329d1f70>
Did you mean?  when

Что я делаю не так? Предыдущая реализация will_paginate работала с точки зрения отображения всех сообщений друзей пользователя. Я заблудился относительно того, что изменилось при переходе на pagy.

ОБНОВЛЕНИЕ:

Итак, на данный момент я решил эту проблему, переместив логи "where ..." c в контроллер. Итак:

@pagy, @posts = pagy_countless(Post.where(user_id: current_user.friends).order('created_at DESC'), items:5, link_extra: 'class="" style="color:#222222; margin:3px;"')

И теперь все работает как раньше. Но я все еще не понимаю, почему я должен был это сделать.

1 Ответ

0 голосов
/ 12 января 2020

Имейте в виду, pagy_countless возвращает массив элементов вместо коллекции ActiveRecord. Вот почему вы не можете использовать методы ActiveRecord для @posts (например, where).

Перейдите по моей ссылке, чтобы увидеть, что коллекция преобразуется в массив с использованием to_a, а затем возвращается как второй аргумент pagy_countless: https://github.com/ddnexus/pagy/blob/bd88866ad6001ae1ef6ce63080d36ecff7bc5603/lib/pagy/extras/countless.rb#L29

Два комментария:
1. Вы должны использовать фильтры ActiveRecord перед вызовом pagy_countless в своей коллекции (например: where предложения)
2. Если вам нужно отфильтровать записи после разбивки на страницы (что не имеет смысла в большинстве случаев), вы должны использовать Array методы, такие как select из reject, как следующие @posts.select { |record| record.user.in?(current_user.friends) }

...