6.1 Userモデル
ここではデータ構造を作成する。
6.1.1 データベースの移行
string
型のnameカラム、string
型のemailカラムをもつusersテーブルを作成したいとき次のようにする。
rails g model User name:string email:string
テーブル名は複数形(users)なのに、モデル名は単数形(User)を使う。ややこしい!DBのテーブルは複数のユーザーがいるからusersと複数形で、モデルはひとりのユーザーを表すから単数形のようだ。
上のコマンドはユーザーコントローラを作ったときにコマンド
rails g controller Users new
と似ていることに注意しておく。
するとマイグレーションファイルが作成される。
class CreateUsers < ActiveRecord::Migration[5.1] def change create_table :users do |t| t.string :name t.string :email t.timestamps end end end
マイグレーション自体は、DBに与える変更を定義したchange
メソッドの集まり。
create_tableはブロックつきメソッド。イメージとしては、
あくまでイメージです。 create_table :users do { |t| t.string :name t.string :email t.timestamps } end
波カッコで囲まれているところが1つのブロックだろうか。
以上をDBに反映するため、マイグレーションを実行
rails db:migrate
6.1.2 modelファイル
Userモデルを作成したときに、あわせてモデル用のuser.rbもつくられる。
app/models/user.rb
class User < ApplicationRecord end
6.1.3 ユーザーオブジェクトを作成する
Railsコンソールでユーザーオブジェクトを作成する。
rails console --sandbox
DBを変更したくない場合は、--sandboxをつける。コンソール終了時にロールバックしてくれる。
ユーザーオブジェクトの作成の流れ
User.newでuserオブジェクトを作成
user = User.new(name: "Michael Hartl", email: "mhartl@example.com") => #<User id: nil, name: "Michael Hartl", email: "mhartl@example.com", created_at: nil, updated_at: nil>
user.saveでDBに保存する(sandboxモードなので、コンソールから抜けると保存は取り消される)
user.save
saveメソッドは、成功すればtrueを、失敗すればfalseを返す。ここまでがユーザーオブジェクトの作成の一連の流れ。
createとdestroy
User.createでモデルの生成と保存を同時におこなえる
>> User.create(name: "A Nother", email: "another@example.org")
User.saveとちがい、User.createは、trueかfalseを返す代わりに、ユーザーオブジェクト自身を返す。
destroyはcreateの逆。
>> User.create(name: "A Nother", email: "another@example.org")
6.1.4 ユーザーオブジェクトを検索
findメソッド
User.find(1)
見つからなかった場合、findメソッドは、例外を発生させる。
6.1.5 ユーザーオブジェクトの更新
おさらい
変更をDBに保存するにはsaveを実行
>>user.save
reload
保存を行わず、reloadを実行すると、DBの情報を元にオブジェクトを再読み込みするので、変更が取り消される。
>> user.email => "mhartl@example.net" >> user.email = "foo@bar.com" => "foo@bar.com" >> user.reload.email => "mhartl@example.net"
update_attributes
属性を更新するもう1つの方法はupdate_attributes(複数形に注意)を使う
>> user.update_attributes(name: "The Dude",email: "dude@abides.org") => true >> user.name => "The Dude" >> user.email => "dude@abides.org"
update_attributesメソッドは属性のハッシュを受け取り、成功時には更新と保存を続けて同時に行う。
(保存に成功したときはtrueを返す)
ただし、検証に1つでも失敗すると、update_attributesの呼び出しは失敗する。
update_attribute
特定の属性のみを更新したい場合は、update_attributeを使う
>> user.update_attribute(:name, "EI Duderino") => true >> user.name => "EI Duderino"