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 つのカテゴリが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>
4

2 に答える 2

5

このようなことを SQL で行う方法がわからないので、Ruby コードで行う方法を示します。残念ながら、2 つのクエリを実行する必要があります。1つはハンバーガーを、もう1つはサンドイッチを手に入れます。次に、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

このコードは、 1 つの配列にzip「織り込む」ために使用します。ネストされた配列になるため、結果を呼び出して配列をフラットにします。最後に、配列内のすべての値を取り除くために使用します。burgerssandwicheszipflattencompactnil

于 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 に答える