ruby-on-rails – Ruby on Rails和Active Record – 查找在给定y中没有出现的所有x

ruby-on-rails – Ruby on Rails和Active Record – 查找在给定y中没有出现的所有x,第1张

概述假设我有2个模型,Album和 Image,以及名为Album Image的连接模型(以及数据库中的3个相应表). 这些模型共享一个属于多人的关联 – 相册通过album_images有很多图像,反之亦然. Tl;博士版 如何查找未出现在给定相册中的每张图像? 长版 我正在寻找与以下SQL相当的东西: SELECT * FROM imagesWHERE NOT EXISTS ( SELE 假设我有2个模型,Album和 Image,以及名为Album Image的连接模型(以及数据库中的3个相应表).

这些模型共享一个属于多人的关联 – 相册通过album_images有很多图像,反之亦然.

Tl;博士版

如何查找未出现在给定相册中的每张图像?

长版

我正在寻找与以下sql相当的东西:

SELECT * FROM imagesWHERE 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)
总结

以上是内存溢出为你收集整理的ruby-on-rails – Ruby on Rails和Active Record – 查找在给定y中没有出现的所有x全部内容,希望文章能够帮你解决ruby-on-rails – Ruby on Rails和Active Record – 查找在给定y中没有出现的所有x所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1278106.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存