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

时间:2013-07-04 13:12:16

标签: ruby-on-rails ruby-on-rails-3.2

我希望Posts一个接一个地展示belongs_to :categories

帖子控制器:

def index
  @posts = posts.order('created_at DESC').all
end

发布#index视图:

<% @posts.each do |post| %>
  <article>
    <h1><%= post.title %></h1>
    <p><%= post.content %></p>
    <span><%= post.category %><span>
  </article>
<% end %>

使用上面的示例,它将根据创建日期时间显示所有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>

2 个答案:

答案 0 :(得分: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

此代码使用zipburgerssandwiches“编织”到一个数组中。 zip导致嵌套数组,因此我们将在结果上调用flatten以使数组变平。最后,我们使用compact来删除数组中的任何nil值。

答案 1 :(得分:1)

需要在Post模型中更改您的关联。

belongs_to :category

然后发布控制器:

@posts = Post.includes([:category]).order('categories.name ASC').all