2015-11-19 64 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