ActiveRecord オブジェクトの属性が変更されていないかどうかを確認したいと考えています。現在、私はこれをやっています:
prev_attr = obj.attributes
<-これにより、属性名と属性値を含むハッシュが返されます
その後、属性を再度取得し、2 つのハッシュを比較します。別の方法はありますか?
ActiveRecord オブジェクトの属性が変更されていないかどうかを確認したいと考えています。現在、私はこれをやっています:
prev_attr = obj.attributes
<-これにより、属性名と属性値を含むハッシュが返されます
その後、属性を再度取得し、2 つのハッシュを比較します。別の方法はありますか?
実は別の方法があります。あなたはこのようにすることができます:
it "should not change sth" do
expect {
# some action
}.to_not change{subject.attribute}
end
https://www.relishapp.com/rspec/rspec-expectations/v/2-0/docs/matchers/expect-changeを参照してください。
ActiveRecord::Dirtyを使用できます。changed?
モデルの属性が実際に変更された場合は true であり、変更されていない場合は false であるモデルのメソッドを提供します。オブジェクトがデータベースから読み取られたときと比較して、その属性が変更された場合_changed?
など、各属性のメソッドもあります。model.subject_changed?
属性値を比較するmodel.subject_was
には、オブジェクトがインスタンス化されたときに属性が持っていた元の値になります。model.changes
または、キーとして属性名を持つハッシュと、変更された各属性の元の値と変更された値を含む 2 要素配列を返す which を使用できます。
等価マッチャーを使用できるはずです-これは機能しませんか?
a = { :test => "a" }
b = { :test => "b" }
$ a == b
=> false
b = { :test => "a" }
$ a == b
=> true
またはあなたの例を使用するには:
original_attributes = obj.attributes
# do something that should *not* manipulate obj
new_attributes = obj.attributes
new_attributes.should eql original_attributes