2

カテゴリ テーブルと投稿テーブルがあります。投稿はカテゴリに属します。そのカテゴリの最新の投稿を含むすべてのカテゴリのリストを出力したいと考えています。

ちょっとばかげているように感じますが、私はこれに数時間取り組んでいます。カテゴリのクエリを試してみましjoinincludeが、各カテゴリの最新の投稿のみに制限するのに問題がありました。

次に、独自のハッシュまたは配列を作成しようとしましたが、問題が発生し続けました。したがって、これ以上時間を無駄にする前に、私が想像できる次の最もクリーンな方法は次のとおりであると考えました。

これを達成する方法について私が得ることができる助けを本当に感謝します。

以下は私のコードです(最小限に抑えられています)。

デシベル/schema.rb

ActiveRecord::Schema.define(:version => yyyymmddhhmmss) do

  create_table "categories", :force => true do |t|
    t.string   "name"
    t.datetime "created_at",    :null => false
    t.datetime "updated_at",    :null => false
  end

  create_table "posts", :force => true do |t|
    t.string   "title"
    t.integer  "category_id"
    t.datetime "created_at",   :null => false
    t.datetime "updated_at",   :null => false
  end

end

アプリ/モデル/カテゴリ.rb

class Category < ActiveRecord::Base
  ...
  has_many :posts
  ...
end

アプリ/モデル/post.rb

class Post < ActiveRecord::Base
  ...
  belongs_to :category
  ...
end

アプリ/コントローラー/categories_controller.rb

class CategoriesController < ApplicationController
  ...
  def index
    @categories = Category.all
    # The following loop is what my question is about
    @categories.each do |c|
      latest_post = Post.where(:category_id => c.id).order('published_at DESC').first
      # "Inject" post.id and post.title in to the current @categories hash
    end
  end
  ...
end

アプリ/ビュー/カテゴリ/index.html.erb

<% @categories.each do |c| %>
  ...
  <h4><a href="<%= category_path(c) %>"><%= c.name %></a></h4>
  # The following line is how I envision the output to work
  <p><a href="<%= post_path(c.post_id) %>"><%= c.post_title %></a></p>
  ...
<% end %>

raise @categories.to_yaml

---
- !ruby/object:Category
  attributes:
    id: 1
    name: General
    created_at: 2013-01-10 22:08:57.291758000 Z
    updated_at: 2013-01-10 22:09:02.414022000 Z
...

以下は仮説です。 raise @categories.to_yaml

---
- !ruby/object:Category
  attributes:
    id: 1
    name: General
    created_at: 2013-01-10 22:08:57.291758000 Z
    updated_at: 2013-01-10 22:09:02.414022000 Z
    post_id: 80
    post_title: Lorem Ipsum
...
4

1 に答える 1

4

最初に 1 対 1 の関連付けを作成します。

class Category
  has_one :latest_post, :order => "created_at DESC", class_name => "Post"
end

そして熱心なロード:

@categories = Category.includes(:latest_post).all

そして...ほら!

于 2013-01-11T17:20:26.337 に答える