を誤用しincludes
ます。参加するためではなく、熱心な読み込みのためです!
しかし、あなたはそのアプローチについて正しいです。それはあなたの場合に使用することができます。NOT IN (?)
ただし、Railsは、論理的であっても、ネストされた要求を発行しません。代わりに2つのクエリを取得します(NOT IN (id1, id2....,)
の代わりに取得しますNOT IN (SELECT ....)
)。
だから私はあなたがsqueelgemを使うことをお勧めします:
通常のARコード(squeelでプリティフィケーションすることもできます):
featured_posts = WpPost.joins(:terms).where(terms:{term: ['featured']}).uniq
次に、sqeelのパワーを使用します。
WpPost.where{id.not_in featured_posts}
(in
そしてnot_in
また別名で>>
あり、<<
しかし私は誰も怖がらせたくありませんでした)
ブロックの使用と記号の欠如に注意してください。
SQLiteでの
Chinookデータベースに
基づくいくつかの測定:
> Track.all
Track Load (35.0ms) SELECT "Track".* FROM "Track"
joins
との関係like
:
oldie = Track.joins{playlists}.where{playlists.name.like_any %w[%classic% %90%]}
ここにありNOT IN
ます:
> Track.where{trackId.not_in oldie}.all
Track Load (37.5ms) SELECT "Track".* FROM "Track" WHERE "Track"."trackId"
NOT IN (SELECT "Track"."TrackId" FROM "Track" INNER JOIN "PlaylistTrack" ON
"PlaylistTrack"."TrackId" = "Track"."TrackId" INNER JOIN "Playlist" ON
"Playlist"."PlaylistId" = "PlaylistTrack"."PlaylistId"
WHERE (("Playlist"."name" LIKE '%classic%' OR "Playlist"."name" LIKE '%90%')))
ご参考までに:
Track.where{trackId.not_in oldie}.count # => 1971
Track.count # => 3503
# join table:
PlaylistTrack.count # => 8715
結論:によって引き起こされるオーバーヘッドはわかりませんNOT IN
。35.0と37.5の違いは目立ちません。35.0が37.5になることはほとんどなく、その逆もあります。