かりっと揚げたらフライドポテト

㍋出る迄頑張るぞい

saveとreload

今日はRails Tutorialの第6章と第7章の途中までを進めました。第六章からMVCのうちのModelを扱っていきます。一番躓いたのは6.3.1の

spec/models/user_spec.rb

describe "email adress with mixed case" do
    let(:mixed_case_email){"Foo@ExaMple.cOM"}

    it "should be saved as all lower-case" do
        @user.email = mixed_case_email
        @user.save
        expect(@user.reload.email).to eq mixed_case_email.downcase
    end
end

というテストです。大文字と小文字が混ざったアドレスを渡した時に、すべて

app/models/user.rb

class User < ActiveRecord::Base
    before_save { self.email = email.downcase }
end

によって小文字になおしてからデータベースに保存できているかどうかのテストです。ここでのsaveとreloadの意味がよくわりませんでした。メンターに聞いたところ、Railsでデータベースに記述・呼び出しする過程は

  1. Userクラスのオブジェクトを作成(ex: user = User.new(email: "JaGa@ex.com"))
  2. そのオブジェクトの内容をデータベースに保存(ex: user.save)
  3. 今あるオブジェクトにデータベースの内容を反映(reload)

となっていることを知りました。2でsaveした時点ではsaveが破壊的メソッドではないため、オブジェクトのハッシュであるuser.emailを参照すると"JaGa@ex.com"となります。

ですが、上述のbefore_saveメソッドによりデータベースには確かに"jaga@ex.com"と保存されているのです。

そこで3でreloadしてやるとuserオブジェクトの要素が最新のデータベースの内容を反映します。ここでuser.emailを参照すると"jaga@ex.com"となるのです。

 

オブジェクトの参照とデータベースの参照がごったになっていたのでこの例で少しスッキリしました。

にしても.reloadつけてもつけなくてもテストがパスするのはなぜだろう......