如何在 Rails 中使用查询进行简单连接

Posted

技术标签:

【中文标题】如何在 Rails 中使用查询进行简单连接【英文标题】:How to make a simple join with query in rails 【发布时间】:2013-01-28 05:35:07 【问题描述】:

我是 Rails 的新手,但我对 sql 有一些经验,所以现在我真的很难用 Rails 语法做一个简单的事情。

所以,有两个表:

class WorkshopMetadata < ActiveRecord::Base
  attr_accessible :uuid, :action
  belongs_to :workshop
end

class Workshop < ActiveRecord::Base
  has_many :workshop_metadatas
end

而我想做的查询是:

SELECT workshops.*
FROM workshops LEFT JOIN
(SELECT workshop_metadatas.workshop_id as id, workshop_metadatas.uuid 
        FROM workshop_metadatas WHERE uuid = 'smth') as metadatas
WHERE uuid IS NULL

我知道要进行左连接,您必须使用包含,但是我如何包含查询,而不是表?我对此完全感到困惑。

谢谢!

附:在我们研究的同时,是否有任何好的和全面的 Rails 文档?例如,列出包含方法的所有可用参数的那个。

【问题讨论】:

【参考方案1】:

我建议通读the ActiveRecord query interface guide - 它有点冗长,但它有很多很棒的指针!对于详尽的 API 参考,我通常会将您指向 http://api.rubyonrails.org/,但对于 ActiveRecord::QueryMethods 来说,它非常简单:(该指南是最好的选择...

让我重新表述您的查询以确保我的查询正确:您要选择所有没有元数据行的 uuid 为 smth 的研讨会?

值得庆幸的是,rails 允许您下拉查询片段,因此您应该可以通过以下方式完成:

Workshop.joins(
  'LEFT JOIN workshop_metadatas ON workshop_metadatas.workshop_id = workshops.id'
).where('uuid IS NULL')

(在没有子查询的情况下,这不是表达同样的事情吗?如果不是:您应该能够将您的子查询传递给joins 调用)

【讨论】:

是的,这与我想要的非常接近。但是有没有什么方法可以在不使用plainsql的情况下使用rails原生工具来完成这个子查询? 看看***.com/questions/5483407/subqueries-in-activerecord 这个答案准确地展示了如何包含子查询:***.com/a/21557060

以上是关于如何在 Rails 中使用查询进行简单连接的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ARel对子查询进行连接?

Rails 4 - 如何在活动记录查询中为包含()和连接()提供别名

如何在带有 squeel 的 Rails 中使用连接

如何将sql中的查询转换为rails中的查询

如何在 Arel 和 Rails 中进行 LIKE 查询?

Rails 在带有连接的 where 子句中运行 AND 查询