Ruby on RailsのCRUDを学ぶ。Update編。updateコマンドとsaveコマンド。バリーデータの有無
さて、今回はRailsでCRUDを学ぶシリーズのUpdate編です。他のシリーズについては、リンクを貼っているのでそちらを参照できればと思います。
UpdateメソッドとSaveメソッド
早速, RailsでレコードをUpdateする方法について説明していきます。
Railsでレコードを更新する際のメソッドは、updateメソッドとsaveメソッドがあります。他の記事にも書きましたが、更新方法は以下のようになります。
saveメソッドでの更新
blog = Blog.find(1)
blog.title = "タイトルだよう"
blog.content = "ここがコンテンツです"
blog.save
updateメソッドでの更新
blog = Blog.find(1)
blog.update( title: "タイトルだよう", content: "ここがコンテンツです" )
updateメソッドとsaveメソッドの違いはそこまでなく、個人的な肌感ではupdateメソッドを使う場合が多いように感じます。特に、saveメソッドでないといけない理由がなければupdateメソッドで書いてしまいます。
updateメソッドとupdate!メソッド
RailsのCRUDに関して必ず抑えておいてもらいたいところとして、!つきメソッドと!なしメソッドの違いです。
それぞれのメソッドの違いは、
!つき ( find_by!, create!, update!, save!など ) ・・・ 失敗した場合に例外を発生させる
!なし( find_by, create, update, save など )・・・失敗しても例外は発生させず、true/falseを返す。
になります。transactionを貼っている場合などには、特に理由がなければ!つきメソッドを使うことでレコードの更新や作成が失敗した場合にロールバックさせることができます。
transactionないで!をつけないと、ロールバックされることなくサイレントで処理が継続することになるので気をつけましょう。
複数レコードの更新
先ほどの例では、一つのレコードの更新の例でしたがupdateメソッドでは複数レコードの更新をすることができます。 以下の例では、Blogモデルの前から10個のタイトルを更新しています。
Blog.limit(10).update( title: 'タイトル一括更新' )
さらには、こちらはwhereとも合わせて使えるので
Blog.where( id: [ 1, 3, 5, 7, 9]).update( title: '奇数idの記事タイトル一括更新' )
のように、条件を指定してレコードを一括で更新することができます。 (SQLで言う所の Update ~ Where文を実現することができます)
バリデーションありのメソッドとなしのメソッド
Railsでは、デフォルトでモデルでのバリデーションを行うことができます。 バリデーションとは値の妥当性チェックで、もっと端的いうと「年齢のカラムに文字列はいれられないよ」というように 期待した形の値であるかどうかをチェックするということです。
Railsでのバリデーションでの定義の仕方は、以下のようになります。
class Blog < ApplicationRecord
validates :content, length: { maximum: 140 }
end
ここでは、ブログの内容を140文字以下に制限しています。 (詳しい定義の仕方はRailsガイドをご覧ください) このように、モデルファイルにvalidationを定義することで、updateやcreateが走るときにそれぞれのカラムの値の形があっているどうかを判断してくれます。
実際にこのモデルに対して、141文字の文章を入れるupdate文を走らせようとするとモデルの更新が失敗してデータの不整合がおこらないようにしてくれます。
blog = Blog.first
blog.update( content: 'この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、' )
(0.2ms) BEGIN
Category Load (0.4ms) SELECT `categories`.* FROM `categories` WHERE `categories`.`id` = 1 LIMIT 1
(0.2ms) ROLLBACK
=> false
141文字でレコードを更新しようとすると、更新が失敗してレコードfalseが返却されます。
このように、バリデーションはテーブル内でデータの不整合が起こらないように防ぐ仕組みですが、Railsのメソッドではレコードの変更前にバリデーションを行ってくれるメソッドと行わないメソッドが両方あります。
以下のメソッドではupdateと同様のことができるメソッドですが、実行時にバリデーションを実行してくれないので、 注意が必要です。
- update_all
- update_attribute
- update_column
- update_columns
まとめ
最後まとめです。
- レコードの更新はupdate,saveメソッド
- 複数レコードの更新もupdateメソッドで可能。
- updateメソッドはwhere文と組み合わせて一定の条件でレコードを更新できる
- !つきメソッドとなしメソッドの違いは例外を発生させるかどうか
- update_all, update_attributeなどはバリデーションせずにレコードを更新するので要注意
レコードの更新方法が身についてきたら、バリデーションの有無、!つきメソッドとなしメソッドの違いも意識できるようになりましょう!