ruby find 语法解析

本文介绍Rails中find方法的各种用法,包括基本查询、排序、限制、条件筛选等,并对比了:include与:joins的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值