ruby-on-rails - 向 Rails View 添加了下一个/上一个按钮。为什么 Next 会跳过某些实例?

标签 ruby-on-rails ruby ruby-on-rails-3 postgresql heroku

我添加了 Next 和 Previous 按钮来循环查看 Rails 3.2 应用程序上的资源。 Next 和 Previous 应该只是通过 ID 循环。

“上一个”按钮按预期工作:它是指向(当前 ID 减 1)的链接。

但是,“下一步”按钮链接到任意 ID 号。对于任何小于 17 的 ID,“下一步”按钮链接到 ID 号 17。单击该按钮将显示链接到 31、45、58、59、65、82、108、115、120、127、128、129 的“下一步”按钮, 131, ... 从那里开始,差距不那么频繁了,但仍然会出现。

该资源称为 Lecture,因此这是 app/models/lecture.rb 的相关部分:

def previous
  Lecture.where(["id < ?", id]).last
end

def next
  Lecture.where(["id > ?", id]).first
end

这是 View ,app/views/lectures/show.html.erb:

<li class="previous">
  <%= link_to "Previous", @lecture.previous if @lecture.previous.present? %>
</li>
<li class="next">
  <%= link_to "Next", @lecture.next if @lecture.next.present? %>
</li>

Resource lecture的生产数据其实是从1到173的连续ID。

我怀疑这是与批量编辑我的生产数据有关的问题,但我想不出任何方法来确定。我在 Heroku/postgres 上。

最佳答案

由于您使用的是 Heroku Postgres,因此适用标准 SQL 陷阱:

除非您明确指定顺序,否则 SQL 查询返回的记录顺序是未定义的。

您的 previousnext 代码假定查询结果将按 ID 排序,但这不是您返回的内容; Postgres 会在最方便的地方返回任何最方便的记录。

链接一个简单的 order在您的查询上将按照您期望的顺序为您提供记录:

Lecture.where(["id < ?", id]).order('id').last

(当然,您可以将 id 替换为任何其他列,如果按其他一些条件遍历记录更有意义的话。)

关于ruby-on-rails - 向 Rails View 添加了下一个/上一个按钮。为什么 Next 会跳过某些实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20508815/

相关文章:

ruby-on-rails - 设计如何在 View 中访问资源/资源名称

ruby-on-rails - Rails 3 ActiveRecord 关联集合自定义方法

ruby-on-rails - 使用 Ubuntu VVM 开发 Rails 非常慢

ruby - Rails 中的事件机错误

javascript - 从源代码构建 WysiHat?

ruby-on-rails - 使用 Bitbucket Pipelines 和 Docker 为 Ruby on Rails 项目设置 CD

ruby - 代码重构以删除重复的正则表达式

ruby - 修复 OS X 上 Phusion Passenger + Sinatra +Nginx 的权限错误

javascript - 压缩和解压 Stack Overflow 主页 HTML

ruby-on-rails - 默认命名空间路由