我如何有条件地验证1-1模型关系?

时间:2012-12-30 03:30:54

标签: ruby-on-rails ruby-on-rails-3 validation relationship

我有一个模型Person,如果它的类型是“已安排”,则需要一个时间表。在它的控制器(继承自InheritedResources::Base):

def create
  super do
    @person.schedule = Schedule.create params[:schedule] if @person.scheduled?
  end
end

问题是,我想验证所有“预定”类型的人都有一个时间表。像这样:

validates :schedule, :presence => true, :if => :scheduled?

在Person模型中。但由于时间表belongs_to是一个人,它需要在创建之前创建该人(因此该人将拥有一个ID)。因此,在我的控制器中,人员验证失败,因为需要稍后创建计划。

Rails中有什么东西我不知道,这将使我能够执行这些验证吗?如果我使用accepts_nested_attributes_for,是否允许这些验证通过?

1 个答案:

答案 0 :(得分:0)

也许只是不事先创建它?

@person.schedule = Schedule.new params[:schedule] if @person.scheduled?

所以@person和分配的时间表应同时保存 (交易)。

我认为这是唯一正确的方法。


更新(由于super:create conception):

超级行动

def create(&block)
  ...
  yield @person if block_given?
  @person.save # line where @person get saved
end

继承的行动

def create
  super do |person|
    person.schedule = Schedule.new params[:schedule] if person.scheduled?
  end
end