2010-12-02 14 views
7

私はこのスキーマを持っています:投稿belongs_toカテゴリとカテゴリhave_many投稿。 ポストとカテゴリが私のPostsControllerの中の宝石のglobalize3Rails 3には翻訳が含まれていますglobalize3 activerecord

class Post < ActiveRecord::Base 
    belongs_to :category 
    translates :title, :excerpt, :desC# globalize3 
end 

class Category < ActiveRecord::Base 
    has_many :posts 
    translates :name # globalize3 
end 

でグローバル化している私は、このコード行を持つすべての記事を取得:

def index 
    @posts = Post.includes([:translations, {:category => :translations}]) 
end 

問題は、私は、カテゴリの翻訳を有するn + 1クエリ問題を抱えているということですテーブル:

Post Load (0.3ms) SELECT "posts".* FROM "posts" 

Post::Translation Load (0.3ms) SELECT "post_translations".* FROM "post_translations" WHERE ("post_translations".post_id IN (2,3,4)) 

# START n+1 query block 
Category Load (1.9ms) SELECT "categories".* FROM "categories" WHERE ("categories"."id" IN (9,12,11)) 
Category::Translation Load (0.4ms) SELECT "category_translations".* FROM "category_translations" WHERE ("category_translations".category_id = 9) AND ("category_translations"."locale" IN ('it')) 
CACHE (0.0ms) SELECT "category_translations".* FROM "category_translations" WHERE ("category_translations".category_id = 9) AND ("category_translations"."locale" IN ('it')) 
Category::Translation Load (0.2ms) SELECT "category_translations".* FROM "category_translations" WHERE ("category_translations".category_id = 12) AND ("category_translations"."locale" IN ('it')) 
CACHE (0.0ms) SELECT "category_translations".* FROM "category_translations" WHERE ("category_translations".category_id = 12) AND ("category_translations"."locale" IN ('it')) 
Category::Translation Load (0.2ms) SELECT "category_translations".* FROM "category_translations" WHERE ("category_translations".category_id = 11) AND ("category_translations"."locale" IN ('it')) 
CACHE (0.0ms) SELECT "category_translations".* FROM "category_translations" WHERE ("category_translations".category_id = 11) AND ("category_translations"."locale" IN ('it')) 
# END n+1 query block 

Category::Translation Load (0.5ms) SELECT "category_translations".* FROM "category_translations" WHERE ("category_translations".category_id IN (9,12,11)) 

このn + 1クエリの問題をどのように解決できますか?

答えて

11

モデルで翻訳を熱心に読み込むことを有効にする必要があります。これを実行することをお勧めの方法は次のとおりです。

class Category < ActiveRecord::Base 
    has_many :posts 
    translates :name # globalize3 

    default_scope includes(:translations) 
end 
2

Railsの4

class Category < ActiveRecord::Base 
    has_many :posts 
    translates :name 

    default_scope { includes(:translations) } 
end 
:これはまだ若干の修正と連携のMichałSzajbeからの回答を撮ります
関連する問題