`

ruby find 语法解析

阅读更多
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,rder => "created_at desc")
:limit     截取limit条数据   Account.find(:all, :limit => 4)
:offset   偏移,总是和limit一起使用,指定偏移几条数据    Account.find(:all, :limit => 4,ffset => 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")
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics