我怎样才能编写一个验证来确保现有关联不能在 Rails 3 中更改



我看过很多问题,询问如何验证关联的存在,但这个问题有点复杂。

假设我有三个模型,一个Plane,一个Pilot,和一个Flight

一个Plane可以有一个Pilot和一个Flight

一旦Plane被分配了Pilot,就可以给它分配一个Flight

我想编写一些验证代码来确保一旦Plane同时具有FlightPilot,就无法更改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

相关内容

  • 没有找到相关文章

最新更新