2011-08-11 107 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

相關問題