before_save呼び出しを使用して、特定のマスターに属するすべてのレコードを更新しています。どちらにもitem_idというフィールドがあります。
class Master < ActiveRecord::Base
has_many :records
before_save :update_records
def update_records
self.records.find_each do |r|
r.item_id = self.item_id
r.save
end
end
end
class Record < ActiveRecord::Base
end
これは意図したとおりに機能します(このようなことを行うのが良いかどうかは少しの間脇に置いておきます)。ただし、合格したRSpecテストを取得できません。これは私が試したものです:
describe Master do
describe 'before_save' do
it 'updates records belonging to it' do
master = FactoryGirl.create(:master, item_id: 1)
record = FactoryGirl.create(:record, master_id: master.id, item_id: 1)
master.item_id = 2
master.save
record.item_id.should == 2
end
end
end
その理由は興味深いです。モデルは、正常に保存されたが仕様に戻されないRecordモデルの2番目のインスタンスで機能します。
"MASTER - CREATED IN SPEC"
#<Master:0x007fd0ed55ec20> {
:id => 26,
:item_id => 1,
}
"RECORD - CREATED IN SPEC"
#<Record:0x007fd0ea157e40> {
:id => 16,
:item_id => 1,
:master_id => 26,
}
"RECORD - AFTER SAVE IN MODEL"
#<Record:0x007fd0ed2f9a70> {
:id => 16,
:item_id => 2,
:master_id => 26,
}
"MASTER - UPDATED IN SPEC"
#<Master:0x007fd0ed55ec20> {
:id => 26,
:item_id => 2,
}
"RECORD - FINAL IN SPEC"
#<Record:0x007fd0ea157e40> {
:id => 16,
:item_id => 1,
:master_id => 26,
}
あなたは知っていますか:
- なぜこれが起こっているのですか?
- この仕様を通過させるにはどうすればよいですか?