find
与えられたどのオプションにもマッチする「主キー」に対応するオブジェクト
を取り出せます。
irb> customer = Customer.find(10)
カラム名をつけなくていい。
find_by
与えられた条件にマッチするレコードのうち最初のレコードだけ
を返します。
irb> Customer.find_by first_name: 'Lifo'
=> #<Customer id: 1, first_name: "Lifo">
irb> Customer.find_by first_name: 'Jon'
=> nil
カラム名をつける
irb(main):001:0> user = User.all
TRANSACTION (0.1ms) BEGIN
User Load (0.4ms) SELECT `users`.* FROM `users`
=>
[#<User:0x0000000112c78108
...
irb(main):002:0> post = Post.all
Post Load (0.9ms) SELECT `posts`.* FROM `posts`
=>
[#<Post:0x00000001129215e0
...
irb(main):003:0> post = Post.first
Post Load (0.5ms) SELECT `posts`.* FROM `posts` ORDER BY `posts`.`id` ASC LIMIT 1
=>
#<Post:0x00000001128806e0
...
irb(main):004:0> post.id
=> 3
irb(main):005:0> post = Post.find(id: 3)
Post Load (0.3ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = NULL LIMIT 1
/Users/hyoudoumasatomo/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/activerecord-7.0.2.3/lib/active_record/relation/finder_methods.rb:381:in `raise_record_not_found_exception!': Couldn't find Post with 'id'={:id=>3} (ActiveRecord::RecordNotFound)
irb(main):006:0> post = Post.find(id: "3")
Post Load (0.4ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = NULL LIMIT 1
/Users/hyoudoumasatomo/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/activerecord-7.0.2.3/lib/active_record/relation/finder_methods.rb:381:in `raise_record_not_found_exception!': Couldn't find Post with 'id'={:id=>"3"} (ActiveRecord::RecordNotFound)
irb(main):007:0> post = Post.find_by(id: 3)
Post Load (0.6ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 3 LIMIT 1
=>
#<Post:0x000000011289a270
...
irb(main):008:0> post = Post.find_by(3)
/Users/hyoudoumasatomo/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/activerecord-7.0.2.3/lib/active_record/relation/query_methods.rb:1298:in `build_where_clause': Unsupported argument type: 3 (Integer) (ArgumentError)
irb(main):009:0> post = Post.find_by("3")
Post Load (0.7ms) SELECT `posts`.* FROM `posts` WHERE (3) LIMIT 1
=>
#<Post:0x0000000112a920f0
...
思ったこと
愚かだな。
まだ勉強しよう。
おかしな要求の場合に行う処理を実行する
例外
プログラム実行中に発生した例外的な問題
のこと。
・エラーが起きてプログラムの実行を続けることができなくなった状態。
これをしておかないと
プログラムが続行できない異常事態が起こる
ことを意図的に実行できる。
NoMethodError in Posts#show
Showing /Users/*************/Repos/garden/app/views/posts/show.html.erb where line #12 raised:
undefined method `errors' for nil:NilClass
Couldn't find Post with 'id'={:id=>"3"} (ActiveRecord::RecordNotFound)
'.freeze; @post.errors.full_messages.each do |message|
^^^^^^^
@postがnilなのにも関わらずメソッドを呼ぼうとしていることにエラーが発生する。
Showing /Users/*************/Repos/garden/app/views/posts/show.html.erb where line #12 raised:
上が例外発生するまでの過程を表している。(下から上に並べている)
これをバックトレース、スタックトレース(11章に続きがある。)
と呼ぶ。
12行目が例外が発生している。
rubyコマンドを実行した場合は例外が発生した時点で終了
(それ以降の処理は行われない。)
出典 プロを目指すRuby入門
例外を補足して処理を続行する場合
プログラムに例外処理を明示的に書くことでプログラムを続行させます。
begin
# 例外が起きうる処理
rescue
# 例外が発生した場合の処理
end
例外起きやすいコードを書いておく
posts_controller.rb
def show
begin
@post = Post.find(params[:id])
rescue
@error_message = "例外です。"
redirect_to "/"
end
end