2012-11-29 15 views
0

我有一個工作良好的下一個按鈕,但以前的按鈕只是不想玩好。有趣的是,我已經試圖建立這幾種不同的方式引用的SO和其他方法,但以前總是去的最早記載...上一個按鈕返回到第一個由於某些原因在Rails 3使用嵌套的路線

依我之見模型:

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 %> 

就像我說的,接下來工作很好,但以前返回到最早的記錄。我接近這個結局的智慧。任何人都有答案?

EDITED

日誌:

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) 

完成200 OK在105ms(瀏覽次數:97.8ms | 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' 

最終解決方案:

在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順序或最近到最早的順序。

+0

你爲什麼要使用不同的順序(ASC和DESC)? –

+0

您對以前的查詢很適合我。你確定你有正確的實例變量嗎?你在控制檯試過嗎? –

+0

@AlperKarapınar感謝您獨立驗證。在控制檯它做同樣的事情,以前的回報記錄一。根據您的反饋,我嘗試將方法的名稱更改爲next_sub和previous_sub,並在瀏覽器和控制檯中對結果進行了相同的測試。之前仍然返回到第一條記錄。如果有人有任何其他建議,lmk –

回答

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 - 兩次?可能​​是默認範圍。

我建議你使用新的AR查詢語法,也許reorder排除其他排序範圍:

self.class.where("created_at < ?", created_at).reorder("created_at desc").first 
+0

感謝您的建議,並指出哪裏出了問題。我在答案中添加了第二個日誌文件。當我替換語法時,獲取提交ID的錯誤。 –

+0

我修復了我建議的代碼。它沒有選擇第一條記錄,只是返回了關係 – khustochka

+0

這是現在的工作。我必須在asc旁邊進行更改才能使其工作,並且會在問題結束時發佈最終解決方案,這對其他人很明顯。感謝大家! –

相關問題