如何在Rails中制作“粘性”帖子?

时间:2013-07-17 02:38:43

标签: ruby-on-rails

我仍然是Rails的新手。我正在建立一个博客类型的网站,并希望我的一些帖子“粘性”,就像Wordpress stickies(坚持顶部)。

我知道您可以通过created_at列订购帖子,这就是我现在正在做的事情。但是,无论created_at日期是什么,我怎么能让我的“粘性”帖子保持在我的其他帖子之上?

当前代码:

@posts = Post.all.order('created_at desc')

现在一切正常。我的代码存在一个小问题

@posts = Post.order('sticky, created_at desc')

工作得很好..

3 个答案:

答案 0 :(得分:1)

只需在您的sticky模型中添加布尔属性Post,然后执行:

@posts = Post.order('sticky, created_at desc')

答案 1 :(得分:0)

您有字符串属性:post_type (sticky, normal, or unpublished)。如果您仍在使用字符串属性,请尝试以下操作:

@posts = Post.where('post_type not in (?)', 'unpublished').order('post_type desc, created_at desc')

注意:

  1. .where('post_type not in (?)', 'unpublished')

    • 不显示帖子有未发布的post_type。
  2. .order('post_type desc, created_at desc')

    • 订购post_type降序(粘性,正常)和
    • created_at降序
  3. 不推荐,您应该使用布尔属性,例如

    t.boolean :sticky
    # sticky : true , normal : false
    t.boolean :publish
    # publish : true , unpublish : false
    

    您可以在控制器上使用它:

    @posts = Post.where(:publish => true).order('sticky DESC, created_at DESC')
    

    参见示例:

    Ruby on Rails 3.2.x - Sticky and Publish Post

答案 2 :(得分:0)

试试这个?

在控制器中:

@sticky_posts = Post.where(sticky: true)
@common_posts = Post.where(sticky: false).order('created_at DESC')

在视图中:

<%= render :partial => 'post', locals: {posts: @sticky_post %>
<%= render :partial => 'post', locals: {posts: @common_post %>

只需进行两次查询即可完成您想要的操作。