如何验证嵌套的两个新记录的唯一性在rails中有很多关联

时间:2016-05-04 17:40:25

标签: ruby-on-rails validation

我有一个可以拥有许多汽车的模型人员,我想创建一个嵌套表格,一次创建两个汽车记录,我正在使用accepts_nested_attributes_for。允许一次创建两个汽车记录:

  1. 两厢车
  2. 轿车
  3. 一个人可以将一个或两个汽车领域留空,我正在使用allow_blank来处理。

    型号:

    #### Model: Car
    class Car < ActiveRecord::Base
      belongs_to :person
    
      validates :registration_number, uniqueness: true, allow_blank: true,
                  format: {with: SOME_REGEX}
    
      validate :both_cars_registration_cant_be_same
    
      def both_cars_registration_cant_be_same
        car1 = registration_number if type == 'hatchback'
        car2 = registration_number if type == 'sedan'
        if car1 == car2
          errors.add(:registration_number, "Both number can't be same")
        end
      end 
    
    ### Model : Person   
    class Person < ActiveRecord::Base
      has_many :cars
      accepts_nested_attributes_for :cars, allow_destroy: true, 
               reject_if:  proc { |attr| attr['registration_number'].blank?  }
    

    控制器:

    ### Controller : Person
    
    class PersonsController < ApplicationController
    
      def new
        @person = Person.new
        2.times { @person.cars.build }
      end
    

    以下是部分

    的小片段
    ...
    ...
    ### _form.html.erb ###
    <%= f.fields_for :cars do |car|
       <%= render 'car_form', c: car %>
    <% end %>
    ...
    ...
    
    ### _car_form.html.erb  ###
    <% if c.index == 0 %>
      <p>Type: Sedan</p>
      <%= c.hidden_field :type, value: "sedan" %>
    <% else %>
      <p>Type: Hatchback</p>
      <%= c.hidden_field :type, value: "hatchback" %>
    <% end %>
    
    <div>
      <%= c.label :registration_number %>
      <%= c.text_field :registration_number %>
    </div>
    

    我可以在rails控制台中使用来自Cars模型的validate :both_cars_registration_cant_be_same valid?但是如何从父模型(人)运行此验证,以便在提交表单时收到错误消息两辆车的注册号相同?我想验证为两条记录输入的注册号字段必须不同且不相同。另请告诉我,如果我在index对象上使用fields_for我的表单助手是否是正确的方法呢?

    P.S:使用rails 4

2 个答案:

答案 0 :(得分:0)

将汽车验证移至Person模型。这个问题可能对您有所帮助:Validate that an object has one or more associated objects

答案 1 :(得分:0)

这是一个例子

belongs_to :project


validates_uniqueness_of :title, allow_blank: false, conditions: -> {where(parent_id: nil)}, scope: :project

使用范围验证选项 http://guides.rubyonrails.org/active_record_validations.html