Rails Tutorial 6.1モデルでの登録や更新

投稿者: | 2019年7月30日

Rails Tutorialの6.1章にはデータベース上のレコードにInsert、Update、Deleteを行う方法が記載されています。その方法をまとめておきます。

Modelの登録

膨大な件数をInsertするとき以外は、Insertは1件ずつすれば十分なのでほぼ、この方法で実務レベルまで対応できると思います。

User.new({name:"1", email:"1@localhost"}).save
User.new({name:"2", email:"2@localhost"}).save
User.new({name:"3", email:"3@localhost"}).save

または、下記のようにCreateでやってもいいでしょう。

User.create({name:"1", email:"1@localhost"})

大量のデータを放り込むのであれば、バルクインサートを支援してくれるgemもあるようです。このようなものを使うか、他テーブルに一度展開しておいて生のSQLで登録してしまう方法に切り替えていきます。

INSERT INTO テーブルA
SELECT * 
FROM   テーブルB

Modelの更新

更新の場合は、条件指定で更新する場合、1行を更新する場合が双方ともによくあるので両方をまとめおこうと思います。

生のSQLに近い形で、一括でまとめて更新する(=条件指定で更新する)には下記のようにやればできます。サンプルは、Userテーブルのhoge_flag=0をすべて1にします。

User.where( hoge_flag: 0 ).update_all( hoge_flag: 1 )

ただ、言うまでもなくこの方法は危ないので、複数レコードをまとめて更新するとき以外は、saveやupdate_attributesでやったほうが良いですね。

#更新1
u=User.find_by(name:5)
u.email="update_5@localhost"
u.save

あるいは、update_attributesで更新します。

u=User.find_by(name:4)
u.update_attributes(name:"4_update")

Modelの削除

Modelの削除は面白いことに2通りあります。

  1. destroy
  2. delete

destroyは、ActiveRecordを介してDeleteされるようで、dependent: :destroyが設定されていればその関係性も削除されるようです。基本的にはこっちの削除しておけばよいです。

#削除
User.find(1).destroy
User.find(2).destroy

もう一つはdeleteで、こちらは単純にデータレコードをDelete文で消すイメージで、dependentが設定されていても、それが効かないようです。込み入った事情がない限り、あまり使うことはなさそうです。

User.find(1).delete
User.find(2).delete

ちなみに、削除についてもdelete_all、destroy_allがあるようです。

Hoge.where( user_id: 6 ).delete_all
Hoge.where( user_id: 6 ).destroy_all

Transactionを切ろう

Controllerの中が目立つので良いと思いますが、その中でTransactionを切り、細々とした登録、更新、削除はHelperの中に追い出してしまったほうが良いです。Transactionを切らないと原子性が保たれなくなってしまいますからね…。

User.transaction do 
    maps = convert_to_map( params[:id], params[:data] )
    registor( maps )
end

たまに手動でcommitを発行するレガシーなソースを見たときは本当に怖いですよね…。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です