find_by和find的区别

Published on:

教材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,这样显示就清爽多了有木有:

Tim Chang6个月前

看起來是 find 只能找id
find_by 可以找 裡面所有的元素 (title, description, quantity, price)

** **•回复分享 ›

刘华佼 管理员 ** Tim Chang6个月前

Dash上找到的:
find的用法:
Person.find(1) # returns the object for ID = 1
Person.find("1") # returns the object for ID = 1
Person.find("31-sarah") # returns the object for ID = 31
Person.find(1, 2, 6) # returns an array for objects with IDs in (1, 2, 6)
Person.find([7, 17]) # returns an array for objects with IDs in (7, 17)
Person.find([1]) # returns an array for the object with ID = 1
Person.where("administrator = 1").order("created_on DESC").find(1)

find_by的用法:
Post.find_by name: 'Spartacus', rating: 4
Post.find_by "published_at < ?", 2.weeks.ago

看起来你说的是对的,Person.find("31-sarah"),rating: 4,2.weeks.ago 就是这些不太明白,但不是高频小套路就不用care了。

** **•回复分享 ›

  • 刘华佼 管理员 ** 刘华佼6个月前

    附上Nic老师的回答:

    1)
    31-sarah,这是找某笔数据吧,不代表任何意义
    rating: 4 ,只是他想要找这个 table 里面的 rating 栏位,数值是4而已
    2.weeks.ago,直接翻中文就知道意思了,这个是 ruby 的用法,可以查询 ruby week ago 搜看看 google

    ** **•回复分享 ›

Comments

comments powered by Disqus