0

我有一个很好用的下一个按钮,但上一个按钮就是不想玩得很好。有趣的是,我尝试用几种不同的方式来构建这个,引用 SO 和其他地方的方法,但以前总是去最早的记录......

在我的提交模型中:

   def previous
     self.class.first(:conditions => ["created_at < ?", created_at], :order => "created_at asc")
   end

   def next
     self.class.first(:conditions => ["created_at > ?", created_at], :order => "created_at asc")
   end

在我看来:

<% if @submission.previous %>
  <%= link_to "previous", contest_submission_path(@contest, @submission.previous),
                        :class => 'pull-left btn btn-large' %>
<% end %>
<% if @submission.next %>
  <%= link_to "next", contest_submission_path(@contest, @submission.next),
                        :class => 'pull-right btn btn-large' %>
<% end %>

就像我说的,下一个效果很好,但上一个又回到了最早的记录。我在这件事上快要完蛋了。有人有答案吗?

已编辑

日志:

Started GET "/contests/1/submissions/1" for 127.0.0.1 at 2012-11-30 08:08:52 -0800
Processing by SubmissionsController#show as HTML
  Parameters: {"contest_id"=>"1", "id"=>"1"}
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY users.created_at DESC LIMIT 1
  Contest Load (0.3ms)  SELECT "contests".* FROM "contests" WHERE "contests"."id" = $1 LIMIT 1  [["id", "1"]]
  Submission Load (0.2ms)  SELECT "submissions".* FROM "submissions" WHERE "submissions"."id" = $1 ORDER BY submissions.created_at ASC LIMIT 1  [["id", "1"]]
  CACHE (0.0ms)  SELECT "submissions".* FROM "submissions" WHERE "submissions"."id" = $1 ORDER BY submissions.created_at ASC LIMIT 1  [["id", "1"]]
   Comment Load (0.4ms)  SELECT "comments".* FROM "comments" WHERE "comments"."commentable_id" = 1 AND "comments"."commentable_type" = 'Submission' ORDER BY comments.created_at DESC, created_at
   Submission Load (0.3ms)  SELECT "submissions".* FROM "submissions" WHERE (created_at < '2012-10-08 14:32:40.590930') ORDER BY submissions.created_at ASC, created_at asc LIMIT 1
   Submission Load (0.2ms)  SELECT "submissions".* FROM "submissions" WHERE (created_at > '2012-10-08 14:32:40.590930') ORDER BY submissions.created_at ASC, created_at asc LIMIT 1
  CACHE (0.0ms)  SELECT "submissions".* FROM "submissions" WHERE (created_at > '2012-10-08 14:32:40.590930') ORDER BY submissions.created_at ASC, created_at asc LIMIT 1
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY users.created_at DESC LIMIT 1
  Image Load (0.2ms)  SELECT "images".* FROM "images" WHERE "images"."parent_id" = 2 AND "images"."parent_type" = 'User' LIMIT 1
  Rendered submissions/_follow_unfollow.html.erb (0.1ms)
  Image Load (0.4ms)  SELECT "images".* FROM "images" WHERE "images"."parent_id" = 1 AND "images"."parent_type" = 'Submission' LIMIT 1
  Rendered submissions/_hide_comments_form.html.erb (1.9ms)
  Rendered comments/_form.html.erb (2.5ms)
  Rendered comments/_comment.html.erb (3.5ms)
  Rendered submissions/show.html.erb within layouts/application (21.7ms)
  Rendered layouts/_stylesheets.html.erb (4.3ms)
  CACHE (0.0ms)  SELECT "images".* FROM "images" WHERE "images"."parent_id" = 2 AND "images"."parent_type" = 'User' LIMIT 1
  Role Load (0.5ms)  SELECT "roles".* FROM "roles" INNER JOIN "assignments" ON "roles"."id" = "assignments"."role_id" WHERE "assignments"."user_id" = 2
  Rendered layouts/_header.html.erb (4.6ms)
  Rendered layouts/_footer.html.erb (0.7ms)

在 105 毫秒内完成 200 次 OK(查看次数:97.8 毫秒 | ActiveRecord:3.0 毫秒)

日志 #2

Started GET "/contests/1/submissions/%23%3CActiveRecord::Relation:0x007fc3b5e50af8%3E" for 127.0.0.1 at 2012-11-30 08:43:15 -0800
Processing by SubmissionsController#show as HTML
  Parameters: {"contest_id"=>"1", "id"=>"#<ActiveRecord::Relation:0x007fc3b5e50af8>"}
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY users.created_at DESC LIMIT 1
  Contest Load (0.3ms)  SELECT "contests".* FROM "contests" WHERE "contests"."id" = $1 LIMIT 1  [["id", "1"]]
  Submission Load (0.3ms)  SELECT "submissions".* FROM "submissions" WHERE "submissions"."id" = $1 LIMIT 1  [["id", "#<ActiveRecord::Relation:0x007fc3b5e50af8>"]]
Completed 500 Internal Server Error in 4ms

ActiveRecord::RecordNotFound (Couldn't find Submission with id=#   <ActiveRecord::Relation:0x007fc3b5e50af8>):
app/controllers/submissions_controller.rb:89:in `find_submission'

最终解决方案:

在提交.rb

   default_scope order: 'submissions.created_at DESC'

   def previous_sub
     self.class.where("created_at > ?", created_at).reorder("created_at asc").first 
   end

   def next_sub
     self.class.where("created_at < ?", created_at).reorder("created_at desc").first 
   end

在视图中(显示):

<% if @submission.previous_sub %>
  <%= link_to "previous", contest_submission_path(@contest, @submission.previous_sub),
                        :class => 'pull-left btn btn-large' %>
<% end %>
<% if @submission.next_sub %>
  <%= link_to "next", contest_submission_path(@contest, @submission.next_sub),
                        :class => 'pull-right btn btn-large' %>
<% end %>

我最终交换了方法的名称,以便显示记录顺序与索引匹配,该索引以 DESC 顺序或最近到最早的范围限定。

4

1 回答 1

0

您的代码是正确的,但您的日志显示

SELECT "submissions".* FROM "submissions" 
WHERE (created_at < '2012-10-08 14:32:40.590930') 
ORDER BY submissions.created_at ASC, created_at asc LIMIT 1

如果这是一个搜索以前的查询,这就是它失败的地方(因为它按升序排列以前的日期,并取第一个 - 最早的)。可能是您在进行更改后忘记重新启动应用程序(尽管它应该在开发模式下自动重新加载)?

或者,您可能有default_scope或其他一些违反条件的范围。我想知道为什么有submissions.created_at ASC, created_at asc- 两次?可能submissions.created_at ASC是默认范围。

我建议您使用新的 AR 查询语法,并可能reorder排除其他排序范围:

self.class.where("created_at < ?", created_at).reorder("created_at desc").first 
于 2012-11-30T16:23:43.790 回答