noggy’s blog

自分用の備忘録です。。。

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メソッドは、例外を発生させる。

find_byメソッド
>>User.find_by(email: "mhartl@example.com")

見つからなかった場合、find_byメソッドは、nilを返す。

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"