Pio*_*ioz 7 activerecord ruby-on-rails include globalize2
我有这个架构:帖子belongs_to类别和类别has_many帖子.使用gem globalize3将帖子和类别全球化
class Post < ActiveRecord::Base
belongs_to :category
translates :title, :excerpt, :desc # globalize3
end
class Category < ActiveRecord::Base
has_many :posts
translates :name # globalize3
end
Run Code Online (Sandbox Code Playgroud)
在我的PostsController中,我获得了这行代码的所有帖子:
def index
@posts = Post.includes([:translations, {:category => :translations}])
end
Run Code Online (Sandbox Code Playgroud)
问题是我对类别转换表有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))
Run Code Online (Sandbox Code Playgroud)
我怎么能解决这个n + 1查询问题?
Mic*_*jbe 11
您应该在模型中启用预先加载的翻译.推荐的方法是:
class Category < ActiveRecord::Base
has_many :posts
translates :name # globalize3
default_scope includes(:translations)
end
Run Code Online (Sandbox Code Playgroud)
Rails 4,5,6:从 Micha 那里得到答案?Szajbe 这仍然可以稍作修改:
class Category < ActiveRecord::Base
has_many :posts
translates :name
default_scope { includes(:translations) }
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3900 次 |
| 最近记录: |