1

下面是两个表的一些样本数据中的所有记录: -获取存在两个表

Uploads: 
id: 1 , file_ref:abc 
id: 2, file_ref: abc1 
id: 4, file_ref: abc3 
id: 5, file_ref: abc4 
id: 6, file_ref: abc5 
id: 7, file_ref: abc6 

media: 
id: 3, name: 'My Doc' , type: doc 
id: 6, name: 'My Img' , type: img 

我有这2种型号的轨道。 现在在我的控制器中,我希望在媒体表中存在上传的所有记录,即来自使用ID 3和6的上传表的记录。

+1

该ID是共享的?因此,唯一的记录是'id:6,file_ref:abc5 ',因为'id 3'在表格媒体中不存在? – MatayoshiMariano

+0

您可以将** abc5 **的值更改为** 5 **,还是您必须首先获取该号码,然后才能找到 – MZaragoza

+0

上传中将存在所有媒体,但file_ref仅在上传中可用这是我想要的。所以我必须从上传表格中获取id 6和3的记录。 – AHK

回答

0

你需要的是INNER JOIN其中加盟条件必须是

Upload.joins("INNER JOIN medias ON media.id = uploads.id") 

这将转换表的ID:

"SELECT `uploads`.* FROM `uploads` INNER JOIN media ON media.id = uploads.id" 

编辑:

由于MrYoshiji在此说commentUpload.where(id: Media.all)也会做单个查询。

所以这两个选项的选择将返回所有上传记录哪个ID存在于媒体表

0

您是否在它们之间建立了关系?从它的声音,你没有(你真的应该),但如果你有没有再尝试:

ids = Media.all.ids 
Upload.where(id: ids) 

或一行

Upload.where(id: Media.all.ids) 

这将在上传回的所有记录表具有存在于媒体表中的ID。

+0

Mark,这样做的缺点是,您正在对数据库执行两个查询,一个用于“Media.all.ids”,另一个用于“Upload.where”。用INNER JOIN你只做一个。 – MatayoshiMariano

+1

'Upload.where(id:Media.all)'将执行一个嵌套的'SELECT medias.id [FROM] FROM medias'的SQL查询 - 但这很奇怪,假设Media <->上传关系是唯一的由他们的'id'平等定义 – MrYoshiji

+0

正如@MrYoshiji提到的,​​没有'ids',它会做一个查询 – MatayoshiMariano

0

你可以做一个子查询您的通话

我认为应该是这个样子

Upload.where(media_id: Media.all.map(&:id))

我希望它有帮助