ruby-on-rails - Rails 3 包括翻译 globalize3 activerecord

标签 ruby-on-rails activerecord include globalize2

我有这样的架构:发布所属类别和类别 has_many 发布。
Post 和 Category 使用 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

在我的 PostsController 中,我使用这行代码获取所有帖子:
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 查询问题?

最佳答案

您应该在模型中启用预加载翻译。推荐的方法是:

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

  default_scope includes(:translations)
end

关于ruby-on-rails - Rails 3 包括翻译 globalize3 activerecord,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4337086/

相关文章:

ruby-on-rails - 带 rails 的奇怪的I18n日期输出

coldfusion - 对于include_once,是否有相当于PHP 的ColdFusion?

mysql - after_update 回调不会更新属性

ruby-on-rails - Rails PostgreSQL jsonb GROUP BY 对内部动态键的查询

c++ - 如何消除 GCC 中的外部库/第三方警告

c++ - 我应该如何在我的 C++ 项目中声明全局变量?

ruby-on-rails - 将验证错误数组从一个 Controller 传递到另一个 Controller

ruby-on-rails - 没有路由匹配 [GET] "/admin/sign_out"

javascript - 为什么我的 AJAX 请求在 dev 中是 PUT 请求,但在运行测试时是 GET 请求?

ruby-on-rails - 通过 Rails 3 中的唯一列值选择所有列