find 解析
1:find(id_or_array_of_ids, options)
功能: find是rails用来查找数据库的数据的方法
参数
:first 第一条数据 Account.find(:first) 或 Account.first
:last 最后一条数据 Account.find(:last) 或 Account.last
:all 所有数据 Account.find(:all) 或 Account.all
:id 或 :id数组 Account.find(1) Account.find([1,2,3]),相当于 select * from accounts where id in (1,2,3),也就是说虽然查询了多条数据,但是只用了一条sql语句。
options 详解:
:order 排序 Account.find(:all, :order => "created_at desc")
:limit 截取limit条数据 Account.find(:all, :limit => 4)
:offset 偏移,总是和limit一起使用,指定偏移几条数据 Account.find(:all, :limit => 4, :offset => 2)
:conditions 条件 Account.find(:all, :conditions => ["id > ?", 4] 或
Account.find(:all, :conditions => ["id > :id", {:id => 4}]
:joins 相当于mysql语句中的 left join、right join、inner join Blog.find(:all, :joins => :account, :select => "blogs.*, accounts.email as accounts_email" )
:include 预加载,前提是指定的表与当前表有关联关系 Blog.find(:all, :include => :account)
*重要: :joins和:include的用法比较类似,但是二者又有一定的区别,这两个都能提高效率,让我们谈一下,他们的优点和区别吧
1>: 优点: 举个例子
accounts表和blogs表的关系是一对多
1)blogs = Blog.find(:all) # 查询一次blogs表
blogs.each {|blog| blog.account.email} # 循环多少次,就查询多少次accounts表
2)blogs = Blog.find(:all, :include => :account) #查询了blogs表和accounts表各一次
blogs.each {|blog| blog.account.email} # 不再查询,因为已经加载了accounts表
总结: :include 减少了查询表的次数,提高了访问数据库的效率,:joins和:include都可以减少查询表的次数
注意: 前面的:include预加载,也可以继续优化,也就是使用效率更高的:joins,这种方式叫做‘携带加载’,举例:blogs = Blog.find(:all, :joins => :account, :select => "blogs.*, accounts.email as accounts_email" )
2>: :joins和:include的区别
这两个都是联表查询,可以提高效率,但是:include 是预加载,也就是将关联的信息会预加载到内存,那么当我们用到预加载的内容时,使用这个会很好,如果不用到预加载的内容时,则不要用:include,而要用:joins,例如我们把关联表的某些数据用到条件里时,而不用到页面显示,这时就用:joins,具体的例子: blogs = Blog.find(:all, :include => :account, :conditions => {:accounts => {:id => 1}} )
2: find_by_sql("sql语句") 直接通过sql语句来查询数据 eg: Account.find_by_sql("select * from accounts")
3: find_by_字段 or find_by_字段1_and_字段2 通过一个或多个字段来查询某条数据
find_all_by_字段 or find_all_by_字段1_and_字段2 通过一个或多个字段来查询多条数据
举例:
Account.find_by_username_and_id("zhangcaiyan", 1)
Account.find_all_by_username_and_sex("zhangcaiyan", true)
4: find_or_initialize_by_username_and_... 通过某个或某些字段查找某条数据,如果不存在,则初始化该条数据
find_or_create_by_username_and_... 通过某个或某些字段查找某条数据,如果不存在,则创建该条数据
eg:Account.find_or_initialize_by_username("zhangcaiyan")
Account.find_or_create_by_username("zhangcaiyan")
1:find(id_or_array_of_ids, options)
功能: find是rails用来查找数据库的数据的方法
参数
:first 第一条数据 Account.find(:first) 或 Account.first
:last 最后一条数据 Account.find(:last) 或 Account.last
:all 所有数据 Account.find(:all) 或 Account.all
:id 或 :id数组 Account.find(1) Account.find([1,2,3]),相当于 select * from accounts where id in (1,2,3),也就是说虽然查询了多条数据,但是只用了一条sql语句。
options 详解:
:order 排序 Account.find(:all, :order => "created_at desc")
:limit 截取limit条数据 Account.find(:all, :limit => 4)
:offset 偏移,总是和limit一起使用,指定偏移几条数据 Account.find(:all, :limit => 4, :offset => 2)
:conditions 条件 Account.find(:all, :conditions => ["id > ?", 4] 或
Account.find(:all, :conditions => ["id > :id", {:id => 4}]
:joins 相当于mysql语句中的 left join、right join、inner join Blog.find(:all, :joins => :account, :select => "blogs.*, accounts.email as accounts_email" )
:include 预加载,前提是指定的表与当前表有关联关系 Blog.find(:all, :include => :account)
*重要: :joins和:include的用法比较类似,但是二者又有一定的区别,这两个都能提高效率,让我们谈一下,他们的优点和区别吧
1>: 优点: 举个例子
accounts表和blogs表的关系是一对多
1)blogs = Blog.find(:all) # 查询一次blogs表
blogs.each {|blog| blog.account.email} # 循环多少次,就查询多少次accounts表
2)blogs = Blog.find(:all, :include => :account) #查询了blogs表和accounts表各一次
blogs.each {|blog| blog.account.email} # 不再查询,因为已经加载了accounts表
总结: :include 减少了查询表的次数,提高了访问数据库的效率,:joins和:include都可以减少查询表的次数
注意: 前面的:include预加载,也可以继续优化,也就是使用效率更高的:joins,这种方式叫做‘携带加载’,举例:blogs = Blog.find(:all, :joins => :account, :select => "blogs.*, accounts.email as accounts_email" )
2>: :joins和:include的区别
这两个都是联表查询,可以提高效率,但是:include 是预加载,也就是将关联的信息会预加载到内存,那么当我们用到预加载的内容时,使用这个会很好,如果不用到预加载的内容时,则不要用:include,而要用:joins,例如我们把关联表的某些数据用到条件里时,而不用到页面显示,这时就用:joins,具体的例子: blogs = Blog.find(:all, :include => :account, :conditions => {:accounts => {:id => 1}} )
2: find_by_sql("sql语句") 直接通过sql语句来查询数据 eg: Account.find_by_sql("select * from accounts")
3: find_by_字段 or find_by_字段1_and_字段2 通过一个或多个字段来查询某条数据
find_all_by_字段 or find_all_by_字段1_and_字段2 通过一个或多个字段来查询多条数据
举例:
Account.find_by_username_and_id("zhangcaiyan", 1)
Account.find_all_by_username_and_sex("zhangcaiyan", true)
4: find_or_initialize_by_username_and_... 通过某个或某些字段查找某条数据,如果不存在,则初始化该条数据
find_or_create_by_username_and_... 通过某个或某些字段查找某条数据,如果不存在,则创建该条数据
eg:Account.find_or_initialize_by_username("zhangcaiyan")
Account.find_or_create_by_username("zhangcaiyan")