zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    线上问题随笔记录数据库连接池问题
    MySQL索引类型总结和使用技巧以及注意事项
    elastic-job的原理简介和使用
    新生 & 语不惊人死不休 —— 《无限恐怖》读后有感
    USACO Section2.1 Hamming Codes 解题报告 【icedream61】
    USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】
    USACO Section2.1 Sorting a Three-Valued Sequence 解题报告
    USACO Section2.1 Ordered Fractions 解题报告
    USACO Section2.1 The Castle 解题报告
    USACO Section1.5 Superprime Rib 解题报告
  • 原文地址:https://www.cnblogs.com/qinyan20/p/3643253.html
Copyright © 2011-2022 走看看