首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 3包含translations globalize3 activerecord

Rails 3包含translations globalize3 activerecord
EN

Stack Overflow用户
提问于 2010-12-03 00:09:42
回答 2查看 4.1K关注 0票数 8

我有这样的模式:帖子类别和类别has_many帖子。帖子和类别使用gem globalize3进行全球化

代码语言:javascript
复制
class Post < ActiveRecord::Base
  belongs_to :category
  translates :title, :excerpt, :desc # globalize3
end

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

在我的PostsController中,所有的帖子都是用这行代码写的:

代码语言:javascript
复制
def index
  @posts = Post.includes([:translations, {:category => :translations}])
end

问题是我在使用category转换表时遇到了n+1查询问题:

代码语言:javascript
复制
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查询问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-02 17:19:10

您应该在模型中启用翻译的即时加载。建议执行此操作的方法是:

代码语言:javascript
复制
class Category < ActiveRecord::Base
  has_many :posts
  translates :name # globalize3

  default_scope includes(:translations)
end
票数 12
EN

Stack Overflow用户

发布于 2015-12-08 18:48:05

Rails 4,5,6:从MichałSzajbe那里得到的答案是,这仍然可以通过轻微的修改来工作:

代码语言:javascript
复制
class Category < ActiveRecord::Base
  has_many :posts
  translates :name

  default_scope { includes(:translations) }
end
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4337086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档