📜  在 ruby on rails 中编写 SQL - SQL (1)

📅  最后修改于: 2023-12-03 14:51:09.861000             🧑  作者: Mango

在 Ruby on Rails 中编写 SQL

在 Ruby on Rails 中,通过使用 ActiveRecord,我们可以以面向对象的方式编写 SQL。 ActiveRecord 是一个 ORM 框架,它允许我们将对象映射到数据库表,并以面向对象的方式处理数据库。因此,我们不必编写原始的 SQL 语句。

但是,有时候我们需要执行一些较为复杂的查询,或者我们需要使用一些高级的数据库特性,这时候编写原始的 SQL 会更加方便和高效。

执行原始 SQL

在 Ruby on Rails 中,我们可以使用 ActiveRecord::Base.connection.execute 方法来执行原始的 SQL 语句:

sql = "SELECT * FROM books WHERE author = 'J.K. Rowling'"
result = ActiveRecord::Base.connection.execute(sql)

这将返回一个 ActiveRecord::Result 对象,可以像操作 ActiveRecord 对象一样进行操作。

防止 SQL 注入

使用原始 SQL 语句有一个危险,就是 SQL 注入。为了避免 SQL 注入,我们应该使用占位符。占位符是指在 SQL 语句中使用 ? 来代替实际的参数,然后将参数传递给 execute 方法,在执行 SQL 之前,Rails 会自动将参数进行转义和处理,以避免 SQL 注入的风险:

sql = "SELECT * FROM books WHERE author = ?"
result = ActiveRecord::Base.connection.execute(sql, 'J.K. Rowling')
查询辅助方法

虽然使用原始 SQL 可以很好地查询数据,但它更容易出错并且不如 ActiveRecord 的查询方法易于阅读。因此,ActiveRecord 提供了一些辅助方法,可以将 SQL 查询转换为 Ruby 代码,这使得查询更具可读性。

以下是一些常用的 ActiveRecord 查询方法:

where

where 方法用于指定条件来选择记录:

Book.where(author: 'J.K. Rowling')
select

select 方法用于选择需要的列:

Book.select(:id, :title, :author)
order

order 方法用于对选择的行进行排序:

Book.order(title: :asc)
group

group 方法用于按指定列进行分组:

Book.select(:author).group(:author)
join

join 方法用于连接两个或多个表:

Book.joins(:reviews)
having

having 方法用于指定分组后的筛选条件:

Book.select(:author).group(:author).having('COUNT(*) > 5')
总结

在 Ruby on Rails 中,我们可以使用原始 SQL 来执行复杂的查询,但是为了避免 SQL 注入,我们应该使用占位符。为了使查询更加易于阅读,ActiveRecord 提供了一些辅助方法,例如 whereselectordergroupjoinhaving。但是,我们还是要谨慎使用原始 SQL,可以通过阅读 Rails 文档来了解更多的 ActiveRecord 辅助方法。