Ruby on rails 如何制作';粘性';铁轨上的柱子?

Ruby on rails 如何制作';粘性';铁轨上的柱子?,ruby-on-rails,Ruby On Rails,我对Rails还是有点陌生。我正在建立一个博客类型的网站,并希望使我的一些文章“粘性”,就像Wordpress的粘性(粘到顶部) 我知道你可以通过它在栏中创建的来订购帖子,这就是我现在正在做的。但是,我怎么能让我的“粘性”帖子保持在我其他帖子之上,而不管它的创建日期是什么 当前代码: @posts = Post.all.order('created_at desc') 现在一切都很好。我的代码有一个小问题 @posts = Post.order('sticky, created_at des

我对Rails还是有点陌生。我正在建立一个博客类型的网站,并希望使我的一些文章“粘性”,就像Wordpress的粘性(粘到顶部)

我知道你可以通过它在栏中创建的
来订购帖子,这就是我现在正在做的。但是,我怎么能让我的“粘性”帖子保持在我其他帖子之上,而不管它的
创建日期是什么

当前代码:

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

现在一切都很好。我的代码有一个小问题

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

工作正常。

只需将布尔属性
sticky
添加到您的
Post
模型中,然后执行以下操作:

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

您有字符串属性:
post\u类型(粘性、正常或未发布)
。如果仍在使用字符串属性,请尝试以下操作:

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

  • 。其中('post\u type not in(?),'unpublished')

    • 不显示未发布的帖子类型
  • .order('post\u type desc,created\u at desc')

    • 订单
      post_类型
      带降序(粘性,正常)和
    • 处创建
  • 但这是不推荐的,例如,您应该使用布尔属性

    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')
    
    见示例:

    试试这个

    在控制器中:

    @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 %>
    
    “post”,本地人:{posts:@sticky_post%>
    本地人:{posts:@common_post%>
    

    只需进行两次查询,它就可以执行您想要的操作。

    对不起,我忘了提到“sticky”实际上是一个“post-type”(字符串)&不是boolean@Jon在这种情况下,您可以执行两个查询:一个用于粘滞项,另一个用于非粘滞项。或者像我上面建议的那样,将您的架构更改为具有布尔属性
    sticky
    。@Jon那么您已经做错了。您希望您的“sticky”列可以排序,并使用设置为“sticky”、“normal”和“unpublished”的单个列这完全是错误的,原因有很多。使用状态标志:你应该有一个布尔列,
    sticky
    ,和一个布尔列
    published
    。我明白你的意思。我在其他一些表中已经有很多布尔值了&只是不想变得“布尔值疯狂”…我现在正在修改它,这样我就有了3个不同的布尔值“粘性”、“已发布”和“未发布”。Thx用于提示@meagar@Jon“已发布”和“未发布”不需要两个布尔值"。你发布的帖子是那些发布了<代码>的帖子,发布了<代码>的帖子是真的。你未发布的帖子是那些发布了<代码>的帖子,发布了<代码>的帖子是假的。布尔值的要点是它们代表两种状态。发布的/未发布的和粘性的/不粘性的需要两个布尔值字段,而不是四个。提交答案太迟了…zzzzz我现在正在使用布尔值。.我的代码与您发布的代码完全相同,但似乎仍然无法使其正常工作。既然你们两人给出了相同的答案,我假设问题出在我这边,我正试图找出问题所在wrong@Jon你应该将默认值“false”添加到booleanmm..仍然不工作..我将所有boolean设置为false并将其设置为默认值。我设置了一个发布一个粘性的(通过“计数”进行双重检查)结果仍然不是working@Jon你能告诉我你在你的控制器上尝试了什么吗?我已经创建了,你可以阅读。