根据 .all 和当前对象获取 x 个页面 Ruby

Get x pages based on .all and current objects Ruby

我写了一个函数,但它没有按照我的想法执行,即使测试通过了。

def max_pages(object, current_object, per_page = nil)
  per_page = !per_page.nil? ? per_page : 10
  max_pages = ((object.count - current_object.count )/ per_page.to_f).ceil
end

我想说的是,如果我给你 20 个(总)帖子中的 10 个,并说我想要每页 10 个帖子,我应该得到 1 页。 这个测试有效。但是现在如果我给你 20 个帖子中的 20 个帖子并且每页 10 个帖子,我应该得到 2 页。 本次测试失败

注:当我说"this test"时,我的意思是逻辑测试,而不是实际rspec。

所以要使用这个函数你会这样做:

max_pages(Post.all, post.find(10)) # => 1 pages.

# I should get 2 pages but don't
max_pages(Post.all, Post.all) # => 0 Pages

# This isnt right either, I should only get one page...
max_pages(Post.all, Post.find(5)) # => 2 Pages

最后的测试应该只给我一页,因为我只打算显示所有 20 篇文章中的 5 篇文章,并且由于我说默认是每页 10 篇文章,所以应该有 1 页包含 5帖子。

我认为逻辑有问题:

max_pages = ((object.count - current_object.count )/ per_page.to_f).ceil

我也不确定我会改变什么。

概念,我要的是:

如果您有 20 个帖子,我说我只想要 3 个帖子,并且我应该每页显示 10 个帖子(默认情况下)。我应该得到一页。

如果你有 20 个帖子,我说我只想要 15 个帖子,而且我每页只允许 5 个帖子,我应该收回 3 页。

最后,如果您有 1500 个帖子,而您只想要其中的 500 个,而我只允许每页 10 个帖子,那么您应该有 50 页。

我可以 (current_object.count/per_page.to_f).ceil 但我知道你必须考虑数据库中有多少帖子。

我可能错得离谱。

从你的例子来看,你想要这样:

actual_count = [object.count, current_object.count].min
max_pages = (actual_count / per_page.to_f).ceil

我可以看出帖子总数相关的唯一方法是,如果您请求的帖子数量可能超过数据库中的数量,所以这就是我将 min 放在那里的原因。如果那永远不会发生,您可以完全删除 object。稍微清理一下,我会试试这个:

def max_pages(object, current_object, per_page = 10)
  actual_count = [object.count, current_object.count].min
  (actual_count / per_page.to_f).ceil
end