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でデータベースに記述・呼び出しする過程は
- Userクラスのオブジェクトを作成(ex: user = User.new(email: "JaGa@ex.com"))
- そのオブジェクトの内容をデータベースに保存(ex: user.save)
- 今あるオブジェクトにデータベースの内容を反映(reload)
となっていることを知りました。2でsaveした時点ではsaveが破壊的メソッドではないため、オブジェクトのハッシュであるuser.emailを参照すると"JaGa@ex.com"となります。
ですが、上述のbefore_saveメソッドによりデータベースには確かに"jaga@ex.com"と保存されているのです。
そこで3でreloadしてやるとuserオブジェクトの要素が最新のデータベースの内容を反映します。ここでuser.emailを参照すると"jaga@ex.com"となるのです。
オブジェクトの参照とデータベースの参照がごったになっていたのでこの例で少しスッキリしました。
にしても.reloadつけてもつけなくてもテストがパスするのはなぜだろう......