Ruby on Rails 和Active Record - 查找未出现在给定 y 内的所有 x
假设我有 2 个模型,Album
和 Image
,以及一个名为 AlbumImage
的连接模型(以及数据库中的 3 个相应表)。
这些模型共享一个“has-and-belongs-to-many”关联 - Album
通过 album_images
有许多 images
,反之亦然。
Tl;dr 版本
如何找到未出现在给定相册中的每张图像?
长版本
我正在寻找相当于以下 SQL 的内容:
SELECT * FROM images
WHERE NOT EXISTS (
SELECT * FROM album_images
WHERE album_images.image_id = images.id
AND album_images.album_id = ?
);
即选择 album_images
表中不存在具有相同图像 ID 和给定相册 ID 的行的每个图像。
但不幸的是我不知道如何用 Rails 的查询语法来表达这一点。
Say I have 2 models, Album
and Image
, and a join model named AlbumImage
(and 3 corresponding tables in the database).
The models share a has-and-belongs-to-many association - Album
has many images
through album_images
, and vice versa.
Tl;dr version
How can I find every image which does not appear within a given album?
Long version
I'm looking for something equivalent to the following SQL:
SELECT * FROM images
WHERE NOT EXISTS (
SELECT * FROM album_images
WHERE album_images.image_id = images.id
AND album_images.album_id = ?
);
i.e. select every image where there does not exist a row in the album_images
table with the same image ID and the ID of a given album.
But I unfortunately have no idea how to express this in Rails' query syntax.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
试试这个:
选项 1
这种方法比使用 NOT EXISTS 更好,因为这里的子查询结果由数据库缓存。
选项 2
使用 LEFT OUTER JOIN。
选项 3
如果每个相册的图像数量有限并且您不介意承担一次额外查询的费用:
Try this:
Option 1
This approach is better than using NOT EXISTS as sub query result here is cached by DB.
Option 2
Using LEFT OUTER JOIN.
Option 3
If the number of images per album is limited and you dont mind incurring the cost of one extra query: