will_paginate удаляет посты в группе, когда посты разбиты на страницы - PullRequest
0 голосов
/ 18 сентября 2018

Я использую will_paginate, чтобы разбить посты на группы.В группе может быть много сообщений, и я не хочу показывать все сообщения одновременно.По какой-то странной причине я заметил, что многие сообщения удаляются из базы данных, когда я делаю @group.posts = paginated_posts, как показано в * groups_controller *.

Я не делаю сохранения в @group, почему сообщения удаляются?

Сначала тесты

 69     it "Pagination – get one group and its posts" do
 70       10.times { Fabricate(:post, group: @group, user: @user) }
 71       puts "POST COUNT BEFORE #{@group.posts.count}"
 72       # byebug
 73       get group_path(@group, posts_per_page: 3)
 74       puts "POST COUNT AFTER #{@group.posts.count}"
 75       expect(response).to have_http_status(200)
 76       expect(@group).to be_present
 77     end

Результаты теста

Groups
  GET /group/:group_id?posts_per_page=10&posts_page=2
POST COUNT BEFORE 12
POST COUNT AFTER 3

groups_controller.rb

  9   def show
 10     paginated_posts = @group.posts.paginate(
 11       page: params[:posts_page],
 12       per_page: params[:posts_per_page] || 100000,
 13     )
 14     @group.posts = paginated_posts
 15     render json: @group
 16   end

Бревно

  (0.3ms)  RELEASE SAVEPOINT active_record_1
Started GET "/groups/33?posts_per_page=3" for 127.0.0.1 at 2018-09-18 12:52:13 +0000
Processing by GroupsController#show as HTML
  Parameters: {"posts_per_page"=>"3", "id"=>"33"}
  User Load (2.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "78913bd2-4c72-4c73-ba75-421e154c830b"], ["LIMIT", 1]]
  Group Load (1.4ms)  SELECT  "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT $2  [["id", 33], ["LIMIT", 1]]
  Post Load (2.2ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."group_id" = $1 LIMIT $2 OFFSET $3  [["group_id", 33], ["LIMIT", 3], ["OFFSET", 0]]
  Post Load (0.3ms)  SELECT "posts".* FROM "posts" WHERE "posts"."group_id" = $1  [["group_id", 33]]
   (0.4ms)  SAVEPOINT active_record_1
  Comment Load (0.5ms)  SELECT "comments".* FROM "comments" WHERE "comments"."post_id" = $1  [["post_id", 156]]
  PostImage Load (0.3ms)  SELECT "post_images".* FROM "post_images" WHERE "post_images"."post_id" = $1  [["post_id", 156]]
  Post Destroy (0.3ms)  DELETE FROM "posts" WHERE "posts"."id" = $1  [["id", 156]]
  Comment Load (0.3ms)  SELECT "comments".* FROM "comments" WHERE "comments"."post_id" = $1  [["post_id", 157]]
  PostImage Load (0.3ms)  SELECT "post_images".* FROM "post_images" WHERE "post_images"."post_id" = $1  [["post_id", 157]]
  Post Destroy (0.3ms)  DELETE FROM "posts" WHERE "posts"."id" = $1  [["id", 157]]
  Comment Load (0.3ms)  SELECT "comments".* FROM "comments" WHERE "comments"."post_id" = $1  [["post_id", 158]]

1 Ответ

0 голосов
/ 18 сентября 2018

@group.posts = ... не работает так, как вы думаете. Если у вас есть отношение «один ко многим», и вы присваиваете массив связанных записей существующему объекту group, записи устанавливают и немедленно удаляют внешний ключ group.id. Сохранение не требуется.

Так что, когда вы делаете

@group.posts = paginated_posts

Посты с нумерацией страниц назначаются для ассоциации , а все остальные записи в ассоциации удаляются из ассоциации. Мгновенно. Они не обязательно удалены, но они больше не принадлежат @post

Возможно, вы захотите изменить #to_json ... возможно, добавьте

attr_accessor :page_of_posts

А потом в вашем контроллере

@group.page_of_posts = paginated_posts

И убедитесь, что page_of_posts - это то, что отображается в json. Другие могут предложить лучший способ.

...