rails常用数据库查询操作、方法浅析

2019-09-25 09:50:31于丽

有如下model


class Category < ActiveRecord::Base
    has_many :posts
end
class Post < ActiveRecord::Base
    belongs_to :category
    has_many :comments
    has_many :tags
end
class Comments <ActiveRecord::Base
    belongs_to :post
    has_one :guest
end
class Guest < ActiveRecord::Base
    belongs_to :comment
end

#关联一个关系
Category.all :joins => :posts
#关联多个关系
Post.all :joins => [:category, :comments]
#嵌套关联
Category.all :joins => {:posts => [{:comments => :guest}, :tags]}
为关联查询结果设定条件


time_range = (Time.now.midnight - 1.day)..Time.now.midnight Client.all :joins => :orders, :conditions => {'orders.created_at' => time_ran
#或者
time_range = (Time.now.midnight - 1.day)..Time.now.midnight Client.all :joins => :orders, :conditions => {:orders => {:created_at => time_range}}
5、优化载入
以下代码,需要执行1 + 10次sql


clients = Client.all(:limit => 10) clients.each do |client|
    puts client.address.postcode
end
优化:


clients = Client.all(:include => :address, :limit => 10)
clients.each do |client|
    puts client.address.postcode
end
一次性载入post的所有分类和评论


Post.all :include => [:category, :comments]
载入category为1的所有post和cooment及tag


Category.find 1, :include => {:posts => [{:comments => :guest}, :tags]}
6、动态查询


Client.find_by_name("Ryan")
Client.find_all_by_name("Ryan")
#!方法,没有记录时抛出ActiveRecord::RecordNotFound异常
Client.find_by_name!("Ryan")
#查询多个字段
Client.find_by_name_and_locked("Ryan", true)
#查询不到时就创建并保存
Client.find_or_create_by_name(params[:name])
#查询不到时创建一个实例,但不保存
Client.find_or_initialize_by_name('Ryan')
7、find_by_sql


Client.find_by_sql("SELECT * FROM clients INNER JOIN orders ON clients.id = orders.client_id ORDER clients.created_at desc")
8、select_all
和find_by_sql类似,但不会用model实例化返回记录,你会得到一个hash数组


Client.connection.select_all("SELECT * FROM clients WHERE id = '1'")
9、判断记录是否存在


#通过id来查询
Client.exists?(1)
Client.exists?(1, 2, 3)
#or
Client.exists?([1,2,3])
#通过其他条件来查询
Client.exists?(:conditions => "first_name = 'Ryan'")