根据类别一个接一个地显示帖子

Was*_*per 3 ruby-on-rails ruby-on-rails-3.2

我想展示Postsbelongs_to :categories一个接一个.

帖子控制器:

def index
  @posts = posts.order('created_at DESC').all
end
Run Code Online (Sandbox Code Playgroud)

发布#index视图:

<% @posts.each do |post| %>
  <article>
    <h1><%= post.title %></h1>
    <p><%= post.content %></p>
    <span><%= post.category %><span>
  </article>
<% end %>
Run Code Online (Sandbox Code Playgroud)

通过上面的示例,它将显示所有posts基于创建日期时间.

更新 如果我有两个类别,如burgerssandwiches,我希望它首先显示一个汉堡邮政,然后一个三明治邮政,然后汉堡邮政然后三明治邮政.因此,它在两个类别之间交替,例如:

<article id="1">
 <h1>Cheese Burger<h1>
 <p>Content...</p>
 <span>Burgers category<span>
</article>

<article id="2">
 <h1>Ham Sandwich<h1>
 <p>Content...</p>
 <span>Sandwiches category<span>
</article>

<article id="3">
 <h1>Chicken Burger<h1>
 <p>Content...</p>
 <span>Burgers category<span>
</article>

<article id="4">
 <h1>Tomato Sandwich<h1>
 <p>Content...</p>
 <span>Sandwiches category<span>
</article>
Run Code Online (Sandbox Code Playgroud)

Mis*_*cha 5

我不知道如何在SQL中做这样的事情,所以我将展示如何在Ruby代码中完成它.不幸的是,你需要做两个查询.一个拿汉堡,一个拿三明治.然后我们将使用Ruby在它们之间交替:

burgers = Post.joins(:category).where(:categories => { :name => 'Burgers' })
sandwiches = Post.joins(:category).where(:categories => { :name => 'Sandwiches' })

@posts = if burgers.size > sandwiches.size
  burgers.zip(sandwiches)
else
  sandwiches.zip(burgers)
end.flatten.compact
Run Code Online (Sandbox Code Playgroud)

此代码用于zip"编织" burgerssandwiches进入一个数组.zip导致嵌套数组,因此我们将调用flatten结果使数组变平.最后我们compact用来摆脱nil数组中的任何值.