在Rails视图中添加了Next / Previous按钮。为什么Next跳过某些实例?

时间:2013-12-11 01:27:12

标签: 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

这是视图,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>

资源讲座的制作数据实际上从1到173一直有连续的ID。

我怀疑这是与批量编辑我的生产数据有关的问题,但我认为无法确定。我在Heroku / postgres上。

2 个答案:

答案 0 :(得分:2)

由于您使用的是Heroku Postgres,标准SQL问题适用于:

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

您的previousnext代码假定查询结果将按ID排序,但这不是您要回的内容; Postgres正在返回最方便的记录,无论哪里最方便。

将简单的order链接到您的查询中将按照您期望的顺序获取记录:

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

(当然,如果通过其他一些标准遍历记录更有意义,您可以将id替换为任何其他列。)

答案 1 :(得分:0)

要确保它们遵循模型ID的顺序,请尝试对以下方法进行更改:

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

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

如果有帮助,请告诉我。