【问题标题】:How do I conditionally validate a 1-1 model relationship?如何有条件地验证 1-1 模型关系?
【发布时间】:2012-12-30 03:30:53
【问题描述】:

我有一个模型 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一个Person,它需要在创建自己之前创建这个人(所以这个人会有一个ID)。因此,在我的控制器中,人员验证失败,因为需要稍后创建计划。

Rails 中有什么我不知道的东西可以让我执行这些验证吗?如果我使用了accepts_nested_attributes_for,那会允许这些验证通过吗?

【问题讨论】:

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


    【解决方案1】:

    也许只是不事先创建它?

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

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

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


    已更新(由于 super :create 概念):

    超级动作

    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
    

    【讨论】:

    • Person 对象是在对super 的调用中创建的,因此当此时没有计划时,验证将在该行失败。但是,如果我在创建密钥之前构建日程对象,日程将没有正确的人员引用(因为尚未创建人员,所以它没有 ID)。
    • 如果在super调用中创建了person对象,最好改变action逻辑。 “预定了?”检查必须在此人获救之前进行。您可以向我们展示此操作和超级操作的完整代码,以使其更加清晰。
    猜你喜欢
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多