Как избежать запроса N + 1 в этой ситуации - PullRequest
0 голосов
/ 08 мая 2020

Я не знаю, как решить эту проблему. У меня следующая ситуация:

class Item < ActiveRecord::Base
  has_many :item_parts, dependent: :destroy
  has_many :parts, through: :item_parts
end

class Part < ActiveRecord::Base
  has_many :item_parts, -> { joins(:item).order('item.name asc') }, dependent: :destroy
  has_many :items, through: :item_parts

  accepts_nested_attributes_for :item_parts, allow_destroy: true
end

class ItemPart < ActiveRecord::Base
  belongs_to :item
  belongs_to :part

  attr_accessible :item_id, :part_id
end

На странице activeadmin есть эта форма:

ActiveAdmin.register Part
....

form html: { enctype: 'multipart/form-data' } do |f|
f.inputs do
      f.input :name
      f.has_many :item_party, heading: 'Item', new_record: 'Add a Item', allow_destroy: true do |a|
        a.input :item,
                  label: 'Item',
                  as: :select,
                  collection:  Item.names.call,
                  prompt: '-- Select a Item --'
      end
    end
    f.actions
end

Допустим, у меня есть 1000+ Item, когда я нажимаю на редактирование, я получаю n +1 проблема с запросом.

Я пытался добавить:

ActiveAdmin.register Part
  includes(:item, :item_parts)

Проблема: f.has_many: item_party это дает n + 1 проблему с запросом и «Запрос выполнен для длиннее 30000 мс.

Как их предварительно загрузить или включить?

Как избежать N + 1 в этом случае?

...