在 Elasticsearch Rails 上建立索引时避免 n+1 查询

dca*_*iro 1 optimization ruby-on-rails elasticsearch

我有一个Genre模型,其名称在genre_translations表中翻译(使用globalize gem)

我正在尝试使用elasticsearch-rails gem为模型建立索引

def as_indexed_json(options = {})
  as_json(
    only: %i(type available),
    methods: %i(name),
  )
end
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,Genre.import我在 Rails 控制台上看到以下内容:

[1] pry(main)> Genre.import
  Genre Load (27.1ms)  SELECT  "genres".* FROM "genres"  ORDER BY "genres"."id" ASC LIMIT 1000
  Genre::Translation Load (23.9ms)  SELECT "genre_translations".* FROM "genre_translations" WHERE "genre_translations"."genre_id" = $1  [["genre_id", 1]]
  Genre::Translation Load (0.3ms)  SELECT "genre_translations".* FROM "genre_translations" WHERE "genre_translations"."genre_id" = $1  [["genre_id", 2]]
  Genre::Translation Load (0.3ms)  SELECT "genre_translations".* FROM "genre_translations" WHERE "genre_translations"."genre_id" = $1  [["genre_id", 3]]
  ...
Run Code Online (Sandbox Code Playgroud)

关于如何使用Genre连接索引所有项目以避免 N+1 行为有什么建议吗?

apn*_*ing 5

从这里的文档

    # @example Pass an ActiveRecord query to limit the imported records
    #
    #    Article.import query: -> { where(author_id: author_id) }
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

 Genre.import query: -> { includes(:translations) }
Run Code Online (Sandbox Code Playgroud)