2015-11-19 23 views
2

Ruby on Rails的下一首/上一篇文章下一個元素對象

我有一個索引頁 - 帖子#指數,具有鏈接到網頁顯示每個帖子。每個帖子引用特定主題並可能在不同時間創建,因此帖子的ID不一定是該主題中所有帖子的順序。我希望能夠去下一個&以前的帖子爲特定的主題。

在我的PostsController我有實例變量,所有職位的主題和特定主題正在顯示

def index 
    @topic = Topic.find(params[:topic_id]) 
    @posts = @topic.posts.all 
end 

def show 
    @topic = Topic.find(params[:topic_id]) 
    @posts = @topic.posts.all 
    @post = @topic.posts.find(params[:id]) 
end 

@posts是活動記錄對象的數組 @posts => #<ActiveRecord::AssociationRelation [ #<Post id: 73, topic_id: 3>, #<Post id: 74, topic_id: 3>, #<Post id: 76, topic_id: 3>, #<Post id: 77, topic_id: 3>, #<Post id: 91, topic_id: 3>]

如果這是我可以使用@posts.index(@post)來查找數組中的特定元素的ID,然後執行index + 1index - 1來遍歷帖子數組,但.index是活動記錄中的一種不同方法。如果我在特定主題中的任何指定帖子的展示頁面上,例如,Post id: 76例如,如何以特定主題中的任何帖子適用的方式訪問link_to Post id: 74(下一個)和link_to Post id: 77(上一個)?

回答

0

您只需做到以下幾點:

def show 
    @topic = Topic.find(params[:topic_id]) 
    posts = @topic.posts.order('posts.id ASC') 
    @post = posts.find(params[:id]) 
    @previous_post = posts.where('posts.id < ?', @post.id).first 
    @next_post = posts.where('posts.id > ?', @post.id).first 
end 
+0

感謝這是一個很好的簡潔的解決方案,我需要什麼。我最終改變了。首先讓它們正確循環。 (@ post.id)。'first' to '@next_post = posts.where('posts.id>?',@ post.id)。@next_post = posts.where('posts.id>?',@ post.id)最後' –

0

嘗試這樣:

Post.where("id > ?", 74).order(:id).first 

或者,如果你有一些主題(不知道你的模型),但它看起來類似於這樣:

some_topic.posts.where("id > ?", 74).order(:id).first 

這裏74是當前帖子的ID。

+2

帖子應該是複數,因爲它可能是「has_many」關係 – bosskovic

+0

謝謝,當然應該。 –

0

有幾個寶石的幫助。我已創建了一個它退出靈活,因爲它與任何集合及其順序(當它的硬編碼像這情況並非如此:Book.where("id > ?", 74).order(:id))工作動態

寶石被稱爲nexter,它的基本用法是這樣的:

@books = Book.includes(:author).bestsellers. 
      order("genre", "authors.name", "published_at desc") 

nexter = Nexter.wrap(@books, @books.find(params[:id])) 
nexter.previous 
nexter.next 

查看README瞭解更多信息。

+0

這很酷,但超出了我所需要的範圍。謝謝! –

+0

歡迎您。希望它會有用_next_ time :-) – charlysisto