Active Record 查询接口

 多条件查询:
 

Client.where(“created_at >= :start_date AND created_at <= :end_date”, {:start_date => params[:start_date], :end_date => params[:end_date]})

数列式条件表达式
Client.where(:created_at => (params[:start_date].to_date)..(params[:end_date].to_date))
子集条件表达式
Client.where(:orders_count => [1,3,5])
 
find_each  and find_in_batches
:batch_size 这个参数可以让你在传递给 block 语句块之前指定检索到的每组数据的记录数目。
 :start 这个参数让你可以指定开始的 ID 值。
 
多字段排序

Client.order(“orders_count ASC, created_at DESC”)  或者  Client.order(“orders_count ASC”, “created_at DESC”)

移除这个唯一性约束
 
返回唯一的 name 字段: query = Client.select(:name).uniq
返回所有 name ,即使有重复: query.uniq(false)
 

分组

Order.select(“data(created_at) as ordered_date, sum(price) as total_price”).group("date(created_at)“)
 

覆盖条件表达式

expect : 忽略一些特定的条件表达式.
Post.where(‘id > 10’).limit(20).order(‘id asc’).expect(:order)
SELECT * FROM posts WHERE id > 10 LIMIT 20
 
only 覆盖一些条件表达式.
Post.where(‘id > 10’).limit(20).order(‘id desc’).only(:order, :where)
SELECT * FROM posts WHERE id > 10 ORDER BY id DESC
 

reorder

has_many :comments, :order => ‘posted_at DESC’

Post.find(10).comments.reorder(‘name’)

 

reverse_order

reverse_order 方法会按照指定的排序方式倒序排列。

 

Client.where(“orders_count > 10”).order(:name).reverse_order

joins

Category.joins(:post).select(“distinct(categories.id)”)

time_range = (Time.now.midnight – 1.day)..Time.now.midnight


Client.joins(:orders).where(‘orders.created_at’ => time_range)

Client.joins(:orders).where(:orders => {:created_at => time_range})
 
N + 1
 

clients = Client.limit(10)

clients.each do |client|
puts client.address.postcode
end

改为

clients = Client.includes(:address).limit(10)

client.each do |client|
puts client.address.postcode
end

定义默认的作用域

如果我们希望定义一个 model 里面所有的查询都会执行的作用域,那我们可以在 model 里面使用 default_scope 方法。

class Client < ActiveRecord::Base
default_scope where(“removed_at is NULL”)
end

当这个 model 中执行了查询,就会产生类似如下的 SQL 查询语句:

SELECT * FROM clients WHERE removed_at IS NULL

移除所有的作用域

如果想移除作用域,我们可以用 unscope 方法。当某个特定的查询不需要默认作用域时,这个功能尤其有用。

Client.unscoped.all

 

这个方法移除所有的默认作用域,在数据表上执行普通的查询

posted on 2014-04-03 16:04  qinyan20  阅读(278)  评论(0编辑  收藏  举报