0

현재 사용자가 따옴표가없는 요청을 모두 볼 수있는 앱이 있습니다. 따옴표가없고 다른 사용자의 의견이있는 요청을보고 싶습니다. 내가 사용하고 따옴표를 들어레일스 current_user 님이 의견이없는 모든 게시물을 표시하는 쿼리

:

Request.includes(:quotes).where(quotes: { id: nil }).order(created_at: :desc) 

및 대한

내가 사용 된 쿼리하지 어디 :

Requests.joins(:quotes).where.not(quotes: { service_center_id: current_service_center.id }) 

이 하나의 인용과 함께 작동합니다. 요청에 대해 견적을 보내면 요청은 더 이상 목록에 없지만 다른 사람이 따옴표를 붙이 자마자 내 목록으로 돌아옵니다. 그것은 마치 쿼리가 다른 인용문을 보는 것처럼 나에 의해되지 않기 때문에 요청을 표시 할 경우에도 인용 한 것입니다.

여기가 저를 모델로 들여다 보도록 유도 한 곳이 아닌 Thoughtbot 블로그 링크입니다. 바닥쪽으로 그는 같은 질문을합니다. 나는 저자에게 이메일을 보냈지 만 아직 답장을 보내지 않았다.

사용자 :

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

validates :first_name, presence: true 
alidates :last_name, presence: true 
validates :zipcode,  presence: true 


has_many :autos 
has_many :requests 
has_many :quotes, through: :requests 
has_many :appointments, through: :quotes 

요청 :

belongs_to :user 
belongs_to :auto 
has_many :quotes, dependent: :destroy 
has_many :appointments, through: :quotes 

validates :service, presence: true 

serialize :service 

validates_associated :quotes 

견적 :

여기 https://robots.thoughtbot.com/activerecords-wherenot

내 모델입니다 6,

belongs_to :request 
belongs_to :service_center 

Service_center : 여기

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

has_many :quotes 
has_many :requests, through: :quotes 

답변

0

당신이 당신의 세 가지 목표를 달성 할 수있는 방법입니다. 따옴표와

요청 : 다른 서비스 센터에서 따옴표

Request.includes(:quotes).where(quotes: { id: nil }).order(created_at: :desc) 

요청 : 서비스에서 따옴표와

요청 : 여기

Requests.joins(:quotes).where.not(quotes: { service_center_id: current_service_center.id }) 

는 질문에 대한 답변입니다 센터 :

Request.where.not(
    id: Request.joins(:quotes) 
     .where(quotes: { service_center_id: current_service_center.id }) 
     .select(:id) 
) 

이것은 약간 janky이지만 작동해야합니다. 서브 u 리는 현재 서비스 센터의 견적이있는 모든 요청을 가져옵니다. 외부 쿼리는 첫 번째 목록에없는 요청을 모두 반환합니다. 데이터베이스에서 하나의 쿼리로 빠르게 실행되어야합니다. 동일한 결과를 산출 할 것이다

NOT EXISTS 다른 솔루션을 사용하는 것이다

Request.joins(:quotes).where(
    Quote 
    .where('requests.id = quotes.request_id') 
    .where('quotes.service_center_id = ? ', current_service_center.id) 
    .exists.not 
) 

이것은 SQL에서 NOT EXISTS 부질 될 것이다. 다른 쿼리와 거의 동일한 성능을 가져야합니다. 나는 그것이 단지 선호의 문제라고 생각한다.

+0

확인 중! 신속한 응답과 질문에 대한 재 포맷을 보내 주셔서 감사합니다. current.service_center가 무거운 검색이 될 더 많은 인용문을 얻으므로? 또는 따옴표에서 ID를 끌어 당기는 것은 그렇게 나쁘지 않습니다. 우리가 모든 데이터를 모으는 것과는 다릅니다. –

+0

이 쿼리는 큰 따옴표가있는 경우에도 인용 부호 ids를 Rails로 보내지 않기 때문에 상당히 효율적입니다. 'sql' 또는'.explain'을 보면 상당히 빠른 쿼리입니다. 모든 작업이 데이터베이스에서 일어나고 있습니다. 'NOT EXISTS()'부질의를 가진 질의를 WHERE 절에 쓰는 것과 같습니다. –

+0

불행히도 작동하지 않았고, 이전 결과와 동일한 결과를 보였습니다. 요청에 여러 개의 따옴표가 있으면 결과에서 제외되지 않습니다. 요청 115에 3 개의 따옴표가 있고 그 중 하나가 현재 _service_center에있는 경우 요청 115가 실제로 계속 표시됩니다. –

관련 문제