侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

Rails 学习笔记 06: 查询

barwe
2021-10-21 / 0 评论 / 0 点赞 / 962 阅读 / 1,806 字
温馨提示:
本文最后更新于 2022-07-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Active Record 查询

Ruby语言本身提供的查询工具能够兼容所有常见的关系型数据库,例如MySQL、PostgreSQL和SQLite等。

关系举例:

  • 客户:一个拥有一个地址、多个订单和多个角色

    class Client < ActiveRecord::Base
        hash_one :address
        has_many :orders
        has_and_belongs_to_many :roles
    end
    
  • 地址:一个地址属于一个客户

    class Address < ActiveRecord::Base
        belongs_to :client
    end
    
  • 订单:一个订单属于一个用户

    class Order < ActiveRecord::Base
        belongs_to :client, counter_cache: true
    end
    
  • 角色:一个角色可能对应多个客户

    class Role < ActiveRecord::Base
        has_and_belongs_to_many :clients
    end
    

获取对象

获取单个对象

find

client = Client.find(10)

获取主键为10的Client对象。

未找到对象时,find会抛出异常。

take & take!

client = Client.take
client = Client.take!

获取一个对象,不考虑顺序,可以用来检测表中是否有数据。

未找到对象时,take会返回nil,**take!**会抛出异常。

first & first!

client = Client.first
client = Client.first!

获取按主键排序后的第一个对象。

未找到对象时,first会返回nil,**first!**会抛出异常。

last & last!

client = Client.last
client = CLient.last!

获取按主键排序后的最后一个对象。

未找到对象时,last会返回nil,**last!**会抛出异常。

find_by & find_by!

client = Client.find_by(first_name: 'Lifo')client = Client.find_by! first_name: 'Lifo', last_name: 'Jon'

获取满足条件的第一个对象。

满足条件的对象可能不止一个,相当于Client.where(first_name: 'Lifo').take

未找到对象时,find_by会返回nil,**find_by!**会抛出异常。

获取多个对象

find

通过主键序列获取多个对象。

clients = Client.find [1,2,3]

只要有一个主键的记录未找到,就会抛出异常。

take

指定获取的记录数目,未考虑任何顺序。

clients = Client.take 3

first

指定获取的记录数。

clients = Client.first 3

last

指定获取的记录数。

clients = Client.last 3

批量获取多个对象

当数据表记录过于庞大时,不要使用Client.all.each方法遍历记录。.all.each会一次性读取所有记录,并为每个记录创建一个对象。当记录数过于庞大时,可能会占满内存。

正确的做法是分批读取记录,分批处理。Rails提供了两个方法解决这个问题:find_eachfind_in_batches

find_each

取出一定数目的记录,将每一个记录依次传入代码块。

默认情况下,按主键的升序方式批量取出记录。

参数与find类似,除了:order:limit参数不可用。

此外,还可以提供参数:

  • :batch_size指定一个批次获取的记录数量
  • :start在主键是数值时,指定取数据的起始位置
# 按主键升序排列后,取第2000~7000个记录进行遍历Client.find_each(batch_size: 5000, start: 2000) do |client|    # ... end

find_in_batches

将取出的一批数据作为对象数组传入代码块,而不是像find_each那样传入单个的对象。

使用:include选项同时加载关联的模型。

参数与find_each相似。

Client.find_in_batches(include: :orders) do |clients|    # ...end

条件查询

where方法通过限定查询条件来获取多个记录。

查询条件可以是字符串、数组、哈希。

字符串条件

0

评论区