我已经添加了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上。
答案 0 :(得分:2)
由于您使用的是Heroku Postgres,标准SQL问题适用于:
除非您明确指定订单,否则SQL查询返回的记录顺序是未定义的。
您的previous
和next
代码假定查询结果将按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
如果有帮助,请告诉我。