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

时间:2016-02-22 22:11:07

标签: ruby-on-rails pagination kaminari

我有一个使用Kaminari进行分页的rails应用程序。出于某种原因,在某些页面上,最后一页的最后一些结果会转移到下一页的第一个结果。

这是我的控制人员:

 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>

所以当我点击&#39;下一步&#39;页面,有时它很好,但有时我会看到重复的预告片(实际重复,我检查了ID)。

我做错了什么?

2 个答案:

答案 0 :(得分:4)

假设movies.imdb_rating是一个整数,那么这个排序子句可能会以不同的顺序返回结果:order("movies.imdb_rating desc")

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

您需要添加另一个字段进行排序。也许标题(所以评级,然后标题)或发行年份甚至只是id。例如:order("movies.imdb_rating desc, movies.title")

答案 1 :(得分:0)

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

您可能希望该范围内有scope :released, -> { joins(movie: :releases).where("movies.release_date > ?", 25.years.ago).uniq }

WebElement webElement = driver.findElement(By.xpath("//li[a[text() = 'Initiate Auto Precall (Consignee)']]"));