Client.where(“created_at >= :start_date AND created_at <= :end_date”, {:start_date => params[:start_date], :end_date => params[:end_date]})
数列式条件表达式
子集条件表达式
find_each and find_in_batches
Client.order(“orders_count ASC, created_at DESC”) 或者 Client.order(“orders_count ASC”, “created_at 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)
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
这个方法移除所有的默认作用域,在数据表上执行普通的查询