3

カテゴリや投稿などのモデルを持つ Rails 3 アプリがあります。

カテゴリー

has_many :投稿

役職

所属先:カテゴリ

ループして各カテゴリのデータベースにアクセスしたり、カテゴリごとに 1 つの投稿だけを引き戻したりすることなく、最新の投稿がその横にリストされたカテゴリのリストを表示できるようにしたいと考えています。

この質問が提起するのと同じことをしたい-SQL結合:1対多の関係で最後のレコードを選択する-ただし、できればActive Recordを使用します。

これはばかげたことですか?カテゴリのすべての投稿を熱心に読み込んで戻す必要がありますか? 私はパフォーマンスが気になったので、これを研究し始めました。

4

1 に答える 1

3

自分でクエリを作成しない限り、これが可能かどうかはわかりません。これに関する問題は、レールが熱心な読み込みを処理する方法が、条件付きになったり、結果を制限しようとしたりすると、あまり良くないことです。別の関連付けを作成することで、インクルードをほぼ目的どおりに実行できます。

class Category < ActiveRecord::Base
  has_one :last_post, :class_name => "Post", :foreign_key => "category_id", :order => "created_at desc"
end

次に、includes を通常どおり使用できます。

Category.includes(:last_post).all

しかし、これに関する問題は、これが生成する sql のために、category.last_post を呼び出すと最後の投稿のみが返されるにもかかわらず、カテゴリからすべての投稿を選択していることです。次のような sql が生成されます。

SELECT `categories`.* FROM `categories`
SELECT `posts`.* FROM `posts` WHERE (`posts`.category_id IN (1,2)) ORDER BY created_at desc
于 2011-01-20T10:18:01.360 に答える