2011-08-11 15 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オプションを使用して、親IDの一意性をスコープします。次のようなもの:

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

子の名前は、親のすべての子どもにとって一意でなければなりません。一般的に、子の名前は同じにすることができます。したがって、検証は親と子の両方に関連しています。 validates_associatedはここでは機能しません。他の代替案を提案してください –

+0

validates_uniqueness_ofに関する情報を含む私の答えの編集版をご覧ください。 – gregspurrier