0

私は、現在のユーザが引用符を持たないすべてのリクエストを表示する必要のあるアプリを持っています。私は、他のユーザーからの引用を引用したり要求したりしていないRequestを見たいと思っています。私が使用している引用符なしの場合Railsコメントがないすべての投稿を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 }) 

これは、1つの引用で動作します。私がリクエストを引用すると、そのリクエストはもはやリストにはなくなりますが、他の誰かがそれを引用するとすぐに、それが私のリストに戻ってきます。それは他の引用符が私によって引用されていない場合でも私が引用している場合でも、それが要求を表示するので、クエリが他の引用符を見ているかのように。

ここでは、それが私にモデルを調べるよう促したところではないThoughtbotブログへのリンクです。下に向かって彼は同じ質問をする。私は著者に電子メールを送ったが、まだ返信していない。 https://robots.thoughtbot.com/activerecords-wherenot

ここでは私のモデルは以下のとおりです。

ユーザー

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 

を引用

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) 
) 

これはやや気味悪いですが、うまくいくはずです。副照会は、現在のサービス・センターからの見積りを持つすべての要求を取得します。外部クエリは、最初のリストにないすべての要求を返します。それはデータベース内の1つのクエリでも高速に動作するはずです。同じ結果をもたらす

別の解決策は、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

このクエリは、引用符をRailsに送信していないため、多数の引用符があってもかなり効率的です。 'sql'や' .explain'を見るとかなり高速なクエリです。すべての作業がデータベース内で行われています。これは、 'NOT EXISTS()'サブクエリを持つクエリをWHERE句に書くのと同じです。 –

+0

残念ながら、それは動作しませんでした、それは前のものと同じ結果を与えました。 Requestに複数の引用符がある場合、それは結果から除外されません。リクエスト115が3つの引用符を有し、そのうちの1つが現在の_service_centerからのものである場合、リクエスト115は実際には依然として表示されます。 –

関連する問題