我看过很多问题,询问如何验证关联的存在,但这个问题有点复杂。
假设我有三个模型,一个Plane
,一个Pilot
,和一个Flight
。
一个Plane
可以有一个Pilot
和一个Flight
。
一旦Plane
被分配了Pilot
,就可以给它分配一个Flight
。
我想编写一些验证代码来确保一旦Plane
同时具有Flight
和Pilot
,就无法更改Pilot
。所以我希望这个测试通过:
describe Plane do
context "before updating" do
it "ensures that the pilot cannot be changed if the plane has any flights" do
plane = Plane.create!
plane.pilot = Pilot.create!
plane.flight = Flight.create!
hijacker = Pilot.create!
plane.pilot = hijacker
plane.save.should be_false
plane.errors[:base].should include "Can't change the pilot while in-flight"
end
end
end
我希望对哪些技术可以实现这一目标有一些见解。谢谢大家!
您可以从自定义验证开始,该验证根据数据库中实际存在的基础记录检查更改的记录(位于内存中)。
class Plane < ActiveRecord::Base
validate_on_update :pilot_cannot_be_changed
def pilot_cannot_be_changed
errors.add(:pilot, "cannot be changed while in-flight.")
if pilot.id != Plane.find(id).pilot.id
end
你可以编写自己的验证来确保这一点。但这不会在你分配飞行员的那一刻返回错误,而是在最后,当你拯救飞机时。
所以这是更简单的版本:
class Plane < ActiveRecord::Base
def pilot=(val)
return false if self.pilot && self.flight
@pilot = val
# I'm not sure about this line above, you can use something like this (or both lines)
# write_attribute(:pilot_id, val.id)
end
end
希望这有所帮助(或至少引导您正确的方向)。
问候, NoICE