簡體   English   中英

Ruby on Rails和Active Record - 查找在給定y中沒有出現的所有x

[英]Ruby on Rails & Active Record - finding all x which do not appear within a given y

假設我有2個模型, AlbumImage ,以及名為AlbumImage的連接模型(以及數據庫中的3個相應表)。

這些模型共享一個屬於多人的關聯 - Album通過album_images有很多images ,反之亦然。

Tl;博士版

如何查找未出現在給定相冊中的每張圖像?

長版

我正在尋找與以下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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM