2011-08-11 4 views
2

레코드의 오류 개체에 오류가 추가되었지만 연결은 계속 저장됩니다.ActiveRecord 유효성 검사 : 유효성 검사에 실패해도 연결이 저장 됨

class Parent < ActiveRecord::Base 
     validate :valid_child? 

     #validation methods 
     protected 
     def valid_child? 
     @child_names = Hash.new 
     self.children.each do |curr_child| 
      if @child_names[curr_child.name].nil? 
       @child_names[curr_child.name] = curr_child.name 
      else 
       errors.add(:base, "child name should be unique for children associated to the parent") 
      end 
     end 
     end 
     #associations 
     has_and_belongs_to_many :children, :join_table => 'map__parents__children' 
end 


#query on rails console 

@parent = Parent.find(1) 
@parent.children_ids = [1, 2] 
@parent.save 

답변

3

문제는 기존의 레코드, @parent.children_ids = [1, 2]@parent.save 호출하기 전에 효과에게 데이터베이스의 변경을 것이다.

validates_associated을 사용하여 자체 유효성 검사를 롤링하는 대신 아이들의 유효성을 검사하십시오.

부모의 컨텍스트 내에서 자녀 이름이 고유하도록하려면 validates_uniqueness_of:scope 옵션과 함께 사용하여 상위 ID에 고유성을 적용하십시오. 예 :

class Child < ActiveRecord::Base 
    belongs_to :parent 
    validates_uniqueness_of :name, :scope => :parent 
end 
+0

하위 이름은 상위의 모든 하위 항목에 대해 고유해야합니다. 일반적으로 하위 이름은 동일 할 수 있습니다. 그래서 검증은 부모와 자식 모두에게 관련이 있습니다. 여기서는 validates_associated가 작동하지 않습니다. 제발 다른 대안을 제안하십시오 –

+0

validates_uniqueness_of에 대한 정보가 포함 된 편집 내 대답을 참조하십시오. – gregspurrier

관련 문제