[英]Ruby on Rails & Active Record - finding all x which do not appear within a given y
假設我有2個模型, Album
和Image
,以及名為AlbumImage
的連接模型(以及數據庫中的3個相應表)。
這些模型共享一個屬於多人的關聯 - Album
通過album_images
有很多images
,反之亦然。
如何查找未出現在給定相冊中的每張圖像?
我正在尋找與以下SQL相當的東西:
SELECT * FROM images
WHERE NOT EXISTS (
SELECT * FROM album_images
WHERE album_images.image_id = images.id
AND album_images.album_id = ?
);
即,選擇具有相同圖像ID和給定相冊的ID的album_images
表中不存在行的每個圖像。
但遺憾的是我不知道如何在Rails的查詢語法中表達這一點。
試試這個:
選項1
Image.all(:conditions => ["images.id NOT IN (
SELECT a.image_id FROM album_images a WHERE a.album_id = ?)", alb_id])
這種方法比使用NOT EXISTS更好,因為此處的子查詢結果由DB緩存。
選項2
使用LEFT OUTER JOIN。
Image.all(:joins => "LEFT OUTER JOIN album_images a
ON a.album_id = #{alb_id} AND a.image_id = images.id",
:conditions => "a.image_id IS NULL")
選項3
如果每張專輯的圖像數量有限,您不介意產生一個額外查詢的成本:
conditions = ["id NOT IN (?)",
@album.album_images.map(&:image_id)] unless @album.album_images.empty?
Image.all(:conditions => conditions)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.