`

rails guide个人日志--数据库操作》》查找

阅读更多

Active Record 查询

1.1 获取单个对象

1.1.1 使用主键

使用 Model.find(primary_key) 方法可以获取指定主键对应的对象。例如:

client = Client.find(10)

(注意:不同于find_by())

# => #<Client id: 10, first_name: "Ryan">

1.1.2 take
Model.take 方法会获取一个记录,不考虑任何顺序
client = Client.take
# => #<Client id: 1, first_name: "Lifo">
(可以理解为随机获取一条数据)
1.1.3 first
Model.first 获取按主键排序得到的第一个记录。例如:
client = Client.first
# => #<Client id: 1, first_name: "Lifo">
(即获得数据库中这张表的第一条数据)
1.1.4 last

Model.last 获取按主键排序得到的最后一个记录。例如:

client = Client.last
# => #<Client id: 221, first_name: "Russel">
(即获得数据库的Client表中的最后一条数据)
Model.last 如果没找到匹配的记录,不会抛出异常,而是返回 nil
1.1.5 find_by

Model.find_by 获取满足条件的第一个记录。例如:

Client.find_by first_name: 'Lifo'
# => #<Client id: 1, first_name: "Lifo">
若没有此条记录则返回nil
(find_by根据某个字段查找,返回一个对象,而where会返回一个数组)
1.1.6 take!

Model.take! 方法会获取一个记录,不考虑任何顺序。例如:

client = Client.take!
# => #<Client id: 1, first_name: "Lifo">
如果未找到匹配的记录,Model.take! 会抛出 ActiveRecord::RecordNotFound 异常。
(!不是非的意思,他是抛异常的方法,其他查询也会用到抛异常,如:
first!,last!,find_by!

1.2 获取多个对象

1.2.1 使用多个主键

Model.find(array_of_primary_key) 方法可接受一个由主键组成的数组,返回一个由主键对应记录组成的数组。例如:

client = Client.find([1, 10]) # Or even Client.find(1, 10)
# => [#<Client id: 1, first_name: "Lifo">, #<Client id: 10, first_name: "Ryan">]
1.2.2 take

Model.take(limit) 方法获取 limit 个记录,不考虑任何顺序:

Client.take(2)
# => [#<Client id: 1, first_name: "Lifo">,
      #<Client id: 2, first_name: "Raf">]
1.2.3 first

Model.first(limit) 方法获取按主键排序的前 limit 个记录:

Client.first(2)
# => [#<Client id: 1, first_name: "Lifo">,
      #<Client id: 2, first_name: "Raf">]
(last与此相同)

1.3 批量获取多个对象

find_each 和 find_in_batches 方法的目的是分批处理无法一次载入内存的巨量记录。

如果只想遍历几千个记录,更推荐使用常规的查询方法。

1.3.1 find_each

find_each 方法获取一批记录,然后分别把每个记录传入代码块。在下面的例子中,find_each 获取 1000 各记录,然后把每个记录传入代码块,知道所有记录都处理完为止:

User.find_each do |user|
  NewsLetter.weekly_deliver(user)
end
:batch_size
:batch_size 选项指定在把各记录传入代码块之前,各批次获取的记录数量。例如,一个批次获取 5000 个记录:
User.find_each(batch_size: 5000) do |user|
  NewsLetter.weekly_deliver(user)
end
:start
例如,在有 5000 个记录的批次中,只向主键大于 2000 的用户发送邮件列表,可以这么做:
User.find_each(start: 2000, batch_size: 5000) do |user|
  NewsLetter.weekly_deliver(user)
end
1.3.2 find_in_batches

find_in_batches 方法和 find_each 类似,都获取一批记录。

二者的不同点是,find_in_batches 把整批记录作为一个数组传入代码块,而不是单独传入各记录。

2 条件查询

where 方法用来指定限制获取记录的条件,用于 SQL 语句的 WHERE 子句。条件可使用字符串、数组或 Hash 指定。

2.1 纯字符串条件

如果查询时要使用条件,可以直接指定。例如 Client.where(:orders_count => 2),获取 orders_count 字段为 2 的客户记录。

 

2.2 数组条件

如果数字是在别处动态生成的话应该怎么处理呢?可用下面的查询:

Client.where("orders_count = ?", params[:orders])

Active Record 会先处理第一个元素中的条件,然后使用后续元素替换第一个元素中的问号(?)。

2.4 NOT 条件

SQL NOT 查询可用 where.not 方法构建。

Post.where.not(author: author)

也即是说,这个查询首先调用没有参数的 where 方法,然后再调用 not 方法。

3 排序

要想按照特定的顺序从数据库中获取记录,可以使用 order 方法。

例如,想按照 created_at 的升序方式获取一些记录,可以这么做:

Client.order(:created_at)

还可使用 ASC 或 DESC 指定排序方式:

Client.order(created_at: :desc)
Client.order(created_at: :asc)
或者使用多个字段排序:
Client.order(orders_count: :asc, created_at: :desc)
Client.order(:orders_count, created_at: :desc)
如果想在不同的上下文中多次调用 order,可以在前一个 order 后再调用一次:
Client.order("orders_count ASC").order("created_at DESC")

4 查询指定字段

默认情况下,Model.find 使用 SELECT * 查询所有字段。要查询部分字段,可使用 select 方法。

Client.select("viewable_by")

查询出来的结果为只显示viewable_by字段内容

如果查询时希望指定字段的同值记录只出现一次,可以使用 distinct 方法:

Client.select(:name).distinct

查询后还可以删除唯一性限制:

query = Client.select(:name).distinct

query.distinct(false)

5 限量和偏移

limit 方法指定获取的记录数量,offset 方法指定在返回结果之前跳过多少个记录。例如:

Client.limit(5).offset(30)

这时会从第 31 个记录开始,返回最多 5 个客户对象。

6 分组

要想在查询时使用 SQL GROUP BY 子句,可以使用 group 方法。

7 分组筛选

SQL 使用 HAVING 子句指定 GROUP BY 分组的条件。在 Model.find 方法中可使用 :having 选项指定 HAVING 子句。

分享到:
评论

相关推荐

    rails-beginner-s-guide

    rails-beginner-s-guide是Rails 指导手册,帮组学习了解rails开发

    Ruby on Rails 初体验--北大青鸟教师专题讲座PPT

    在RoR中,数据库操作、测试框架、表单验证、session和flash管理、渲染和重定向机制、布局和局部模板、回调、观察者、过滤器以及强大的缓存机制等都得到了很好的支持,这些内置的功能极大地提升了开发者的生产力。...

    Agile Web Development with Rails-Second Edition-Beta一书例子

    总之,"depot"压缩包为学习者提供了一个宝贵的实践平台,通过实际操作,学习者可以更好地理解《Agile Web Development with Rails-Second Edition-Beta》中介绍的理论和技巧,从而提升自己的Rails开发技能。

    awesome-rails-gem-zh_CN, Rails 常用 Gem 列表 - Awesome Rails Gem 中文版.zip

    以上只是Awesome Rails Gem列表中的一部分,实际列表还包含了更多用于数据库迁移、日志记录、邮件发送、国际化、安全、缓存、版本控制等各个方面的Gem。通过这个列表,开发者可以快速找到适合自己项目的Gem,极大地...

    rails-chm-2-0-2.rar

    `rails-documentation-2-0-2.chm` 文件详细涵盖了这些概念,包含了关于Rails 2.0.2的API参考、教程和指南。通过仔细阅读和实践,开发者能够深入理解Rails的工作原理,并有效地开发出高效、可维护的Web应用。

    rails-documentation-1-2-1.zip

    标题 "rails-documentation-1-2-1.zip" 暗示这是一份关于 Ruby on Rails 框架的文档,版本为 1.2.1。Ruby 是一种面向对象的编程语言,而 Rails 是一个基于 Ruby 的开源 Web 应用程序框架,遵循 Model-View-...

    rails-development-environment-master.rar

    压缩包中的"rails-development-environment-master.zip"可能是整个项目文件夹,包括`app`(应用代码)、`config`(配置文件)、`db`(数据库相关)、`bin`(可执行脚本)、`lib`(自定义库)、`test`(测试)、`...

    flexigrid+rails 新手代码-。-

    - 它包含了一系列内置的库和服务,如 Active Record(数据库操作)、Action Controller(路由和控制器)和 Action View(视图渲染)。 - Rails 提供了 RESTful 路由,使得构建 Web 服务更加简洁和直观。 - 使用 ...

    Scrum Poker in Rails5, docker-compose

    对于Scrum Poker应用,我们可以用Docker Compose定义Rails应用服务、数据库服务(如PostgreSQL或MySQL)、WebSockets服务(如Redis)等,确保它们能协同工作。 在创建Scrum Poker应用的过程中,我们需要设计以下...

    rails-4.2.0-gems

    这在日志记录、审计跟踪或者实现撤销操作时非常有用。 另一个重要特性是Action Mailer的改进,它现在支持发送带有多个附件的邮件。这使得发送包含图片、文档或其他文件的复杂电子邮件变得更加容易。 此外,Rails ...

    rails-yelp-mvp-源码.rar

    【标题】"rails-yelp-mvp-源码" 指的是一个基于Rails框架开发的类似于Yelp(美国知名餐饮评论网站)的最小可行产品(Minimum Viable Product, MVP)的源代码。Rails是Ruby编程语言的一个流行Web开发框架,以其“约定...

    atom-rails-db-scheme:Rails数据库模式的Autocomplete +提供程序

    Rails数据库方案 Rails数据库模式的Autocomplete +提供程序。 特征 自动完成活动记录 根据当前上下文打开模式文件 设定值 ... ' ctrl-r s ' : ' rails-db-scheme:open-scheme ' 去做 多文件夹项目

    rails-builds-test-源码.rar

    这些模型通常对应数据库中的表,通过ActiveRecord实现ORM(对象关系映射),使得我们可以用面向对象的方式来操作数据库。 4. **控制器(Controllers)**:在`app/controllers`目录下,控制器处理HTTP请求,并调用...

    rails应用--导航栏实例工程

    在本项目"rails应用--导航栏实例工程"中,我们将探讨如何在Ruby on Rails框架下构建一个实用的导航栏。Rails是一个流行的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,使得开发过程更加高效且结构...

    rails-tutorial-源码.rar

    - ActiveRecord:这是Rails中的ORM(对象关系映射)组件,它负责数据库操作,将数据库表与Ruby类关联起来,简化了数据库交互。 2. **路由配置** - Rails的路由系统是其强大特性之一,通过routes.rb文件定义URL到...

Global site tag (gtag.js) - Google Analytics