3

我想展示Posts一个belongs_to :categories接一个。

帖子控制器:

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

Post#index 视图:

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

在上面的示例中,它将posts根据创建日期时间显示所有内容。

更新 如果我有 2 个类别,例如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>
4

2 回答 2

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

此代码用于zip“编织”burgerssandwiches进入一个数组。zip结果是嵌套数组,因此我们将调用flatten结果以使数组变平。最后,我们使用compact删除nil数组中的任何值。

于 2013-07-04T13:18:38.253 回答
1

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

belongs_to :category

然后帖子控制器:

@posts = Post.includes([:category]).order('categories.name ASC').all
于 2013-07-04T13:19:51.090 回答