Rails & Kaminari:分页显示重复结果

Rails & Kaminari: Pagination showing duplicate results

我有一个 rails 应用程序使用 Kaminari 进行分页。由于某些原因,在某些页面上,上一页的一些最后结果会被带入下一页的第一个结果。

这是我的控制器:

 def available
    trailers = Trailer.most_recent.released.order("movies.imdb_rating desc").where("movies.imdb_rating IS NOT NULL")
    @trailers = trailers.page(params[:page]).per(18)
end

拖车模型中的范围:

 scope :most_recent, -> {
    where('NOT EXISTS(SELECT 1 FROM trailers b2 WHERE b2.movie_id = trailers.movie_id AND trailers.is_short_trailer = FALSE AND
    b2.is_short_trailer = FALSE
    AND (b2.published_at > trailers.published_at OR b2.published_at = trailers.published_at AND b2.id < trailers.id))').
    where(show: true).
    where(is_short_trailer: false)
  }

  # gets all trailers that have at least one release
  scope :released, -> { 
    joins(movie: :releases).where("movies.release_date > ?", 25.years.ago)
  }

和视图:

<div class="trailers-container">
  <%= render @trailers %>
</div>


<div class="pagination">
  <%= link_to_next_page(@trailers, 'Next') %>
</div>

所以当我点击 'Next' 页面时,有时它很好,但有时我会看到重复的预告片(实际重复,我检查了 ID)。

我做错了什么?

假设 movies.imdb_rating 是一个整数,那么这个排序子句很可能 return 导致不同的顺序:order("movies.imdb_rating desc")

想象一下,如果所有电影的评分都正好是 8。电影可以按任何顺序返回并且是正确的。

您需要添加另一个字段作为排序依据。可能是标题(先是评级,然后是标题)或发行年份,甚至只是 id。例如:order("movies.imdb_rating desc, movies.title")

您正在通过 :movie 与您的 has_many :releases 进行 joins,这将创建多条记录,每个版本对应一条记录。

您可能想要 uniq 在该范围内:

scope :released, -> { 
  joins(movie: :releases).where("movies.release_date > ?", 25.years.ago).uniq
}