有如下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'")










