has_many_association несколько запросов, что делает его медленным - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть таблица has_many_association. Например, Пользователь has_many подписки. На странице индекса активного администратора я показываю несколько вычисляемых полей, для которых мне требуется вызвать user.subscription.last. Так как я звоню это несколько раз. Поэтому из-за этого наш сервер перегружается. Это было обработано на странице индекса, так как показывает только 30 записей. Но при экспорте в CSV наш сервер перегружен из-за нескольких запросов. Я использую примерно 15 запросов для одного пользователя.

Проблема здесь в том, что я должен проверить действительную подписку для печати ее кода. Также я не могу поместить запрос where в scoped_collection, потому что он будет загружать только данные пользователя для действительных подписок. Так как решить эту проблему ???????

def scoped_collection
  end_of_association_chain.includes(:subscriptions, :blogs)
end
index do  
  column :email
  column "referrer" do |user|
    subscription = user.subscriptions.valid.first
    subscription.referrers.first.code if subscription
  end
  column "blog_id" do |user|
     user.blog.id if user.blog
  end

end

Пользователь has_many подписки и подписка has_many рефереры, я хочу первый код реферера

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

В вашем контроллере звоните @subscriptions = current_user.subscriptions

А затем в ваших представлениях вызовите @subscriptions.last, где это необходимо, и новый запрос не будет вызываться в представлениях, поскольку записи уже будут загружены в контроллер.

0 голосов
/ 04 сентября 2018

Получить все поля:

controller do
  def scoped_collection
    Model.all.as_json(include: [:subscriptions,:referrers])
    # prevents N+1 queries to your database
  end
end

Получить поле, например:

controller do
   def scoped_collection
     Model.all.as_json(include: [:subscriptions => {only: :field1}])                                       
   end
 end
0 голосов
/ 04 сентября 2018

Добавьте эти строки в ваш файл users.rb

 controller do
      def scoped_collection
        # Method 1  
        super.includes(subscriptions: :referrers) # prevents N+1 queries to your database
        # method 2
        User.includes(subscriptions: :referrers).select("users.*, (SELECT referrers.code from referrers LIMIT 1) as refer_code")
      end
  end
...