加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby on Rails和Active Record – 查找在给定y

发布时间:2020-12-17 02:29:16 所属栏目:百科 来源:网络整理
导读:假设我有2个模型,Album和 Image,以及名为Album Image的连接模型(以及数据库中的3个相应表). 这些模型共享一个属于多人的关联 – 相册通过album_images有很多图像,反之亦然. Tl;博士版 如何查找未出现在给定相册中的每张图像? 长版 我正在寻找与以下SQL相当
假设我有2个模型,Album和 Image,以及名为Album Image的连接模型(以及数据库中的3个相应表).

这些模型共享一个属于多人的关联 – 相册通过album_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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读