我希望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
。
更新
如果我有burgers
和sandwiches
这两个类别,我希望它首先显示汉堡包,然后是三明治帖,然后是汉堡包,然后是三明治帖。因此,它在两个类别之间交替,例如:
<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>
答案 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
此代码使用zip
将burgers
和sandwiches
“编织”到一个数组中。 zip
导致嵌套数组,因此我们将在结果上调用flatten
以使数组变平。最后,我们使用compact
来删除数组中的任何nil
值。
答案 1 :(得分:1)
需要在Post模型中更改您的关联。
belongs_to :category
然后发布控制器:
@posts = Post.includes([:category]).order('categories.name ASC').all