Оптимизировать запрос рельсов, удаляя метод выбора - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь оптимизировать следующее из-за медленной работы над методом выберите из ruby ​​в более чем 16.000 записей, но я действительно не знаю, как встроить его в SQL-запрос или использовать объединения и включает:

User.invited.not_rejected.order('users.updated_at desc').select{|x| x unless x.rtr.nil?}

Отношения:

class User < ApplicationRecord
  hass_many :transition_elements
  has_many :rtrs, through: :transition_elements

  scope :not_rejected -> { where(rejected: false) }
  scope :invited -> { where(invited: true) }
end

class TransitionElement < ApplicationRecord
  has_many :rtrs
  belongs_to :user
end

class Rtr < ApplicationRecord
  belongs_to :transition_element
end

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Если вы не можете использовать joins, как предлагает @spickermann, вы можете составить несколько ActiveRecord_Relation с:

users = User.not_rejected.invited.order(updated_at: desc)
users.where(rtrs: Rtr.all)

Или, если у вас есть область действия на Rtr, вы можете использоватьэто:

class Rtr < ApplicationRecord
  scope :upside_down, where(upside_down: true)
end

users.where(rtrs: Rtr.upside_down)
0 голосов
/ 08 октября 2018

Я ожидаю, что простой joins(:rtrs) должен работать, потому что он способен обрабатывать has_many through ассоциаций и создает INNER JOIN, который будет возвращать только пользователей, у которых есть хотя бы один rtrs.

User.joins(:rtrs).invited.not_rejected.order(updated_at: :desc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...