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_each
和find_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
方法通过限定查询条件来获取多个记录。
查询条件可以是字符串、数组、哈希。
评论区