2013-07-17 21 views
0

我对Rails还是有点新鲜感。我正在建立一个博客类型的网站,并希望让我的一些帖子“粘性”,就像WordPress的贴纸(坚持顶部)。如何在Rails中制作'sticky'贴子?

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

当前代码:

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

一切的现在工作的罚款。有我的代码

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

工作正常,一个小问题..

回答

1

只是一个布尔属性sticky添加到您的Post模型,然后做:

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

对不起,我忘记提及'sticky'实际上是一个“post type”(字符串)而不是布尔型 – goo

+0

@Jon在这种情况下,您可以执行两个查询:一个用于粘贴,一个用于不粘贴。或者像我上面所建议的那样,改变你的模式以拥有一个布尔属性'sticky'。 – Mischa

+2

@Jon然后你已经做错了。你希望你的“粘性”列是可排序的,并且使用单列设置为“粘性”,“正常”和“未发布”仅仅是错误*,原因很多。使用状态标志:您应该有一个布尔列,'sticky'和一个布尔列'published'。 – meagar

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由大到小

但是,这不推荐,您应该使用布尔属性,例如

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

+0

太迟提交答案... zzzzz –

+0

我现在正在使用布尔值..我具有完全相同的代码,因为您已发布&仍似乎无法使其工作。因为你们都给出了同样的答案,所以我假设问题出在我的身上,并且试图找出问题所在 – goo

+0

@Jon更新了答案 –

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

只是要两个查询,它可以做你想做的。

相关问题