我有一个使用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)。
我做错了什么?
答案 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)']]"));