优化Rails查询删除选择方法

时间:2018-10-08 16:59:43

标签: sql ruby-on-rails ruby

由于红宝石方法 select 的工作缓慢,我试图优化以下内容,将其放入超过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 :(得分:3)

我希望一个简单的joins(:rtrs)应该能起作用,因为它能够处理has_many through的关联并建立一个INNER JOIN,它将仅返回至少有一个{{1} }。

rtrs

答案 1 :(得分:0)

如果您无法像@spickermann所建议的那样使用joins,则可以将多个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)