刘华佼的全栈学习记录

5-11 如何了解Ruby on Rails中,find与find_by的区别?

| Comments

教材5-4 Step 3: 购物车设计 Part 2有一段:

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

 # ...略



+  helper_method :current_cart

+  def current_cart
+    @current_cart ||= find_cart
+  end

+  private

+  def find_cart
+    cart = Cart.find_by(id: session[:cart_id])
+    if cart.blank?
+      cart = Cart.create
+    end
+    session[:cart_id] = cart.id
+    return cart
+  end
end

这里面的一句:cart = Cart.find_by(id: session[:cart_id])中的find_by不太好理解。那如何了解find_by呢?find_by与find又有什么区别呢?

首先,找到它们的定义,在Dash(一个app)中搜索find和find_by:


看了之后觉得不太好理解,那就在rails c里实际操作一下吧!

我做的练习里有Cart这个元素,先Cart.all看看有什么东东:

可以看到只有2个cart,再用cart测试下find函数,在测试find之前,先用我们最熟悉的.first试试看:

测试结果显示:Cart.find(1),Cart.find(2),都可以查到相应id的cart;id=3的cart不存在,于是报ActiveRecord::RecordNotFound的错误。

同样的用find_by试试是什么效果:



没有报错,只是返回nil。

那这就是find和find_by的一个区别了:如果查找不到希望找的元素,find会报ActiveRecord::RecordNotFound的错误,而find_by不报错,返回nil。

网上还介绍了一种用法:
Product.find_by(title: 'the yellow book’)

我们也来试试看:



报错了!什么原因?因为title是Product的字段,而不是Cart的字段。

先看看Product.all,果然有title:



那就用Product来测试吧!

这下OK了!

还有一种写法哦!

看看find_by这么厉害,其实find也很厉害:它可以同时搜索多个指定id的特定元素:



如果觉得这里面的rails c显示的代码很乱,可以在Gemfile里安装一个gem 'awesome_rails_console' ,安装后bundle install,这样显示就清爽多了有木有:

Comments

comments powered by Disqus