2011-03-22 52 views
4

我有兩個型號軌accepts_nested_attributes_for和驗證... Rails的2.3.11

class Group < AR 
    has_many :permissions 
    accepts_nested_attributes_for :permissions, :allow_destroy => true 
end 

class Permission < AR 
    validates_uniqueness_of :action, :scope => [:role] 
end 

我似乎無法得到許可的唯一約束只在更新創建新組時,工作。這是一個示例輸出。有誰知道驗證工作嵌套屬性和唯一約束的最佳方法嗎?

樣本輸出

> g = Group.create(:permissions_attributes => [{:role => 'admin', :action => 'one'}]) 
> # Now add the same permissions, should not be valid 
> g.permissions_attributes = [{:role => 'admin', :action => 'one'}] 
> g.valid? # => false 

即預計。但是,如果我用同樣permissions_attributes創建組的兩倍,它並不否定:

> g = Group.new(:permissions_attributes => [{:role => 'admin', :action => 'one'}, {:role => 'admin', :action => 'one'}] 
> g.valid? # => true  BUT THIS SHOULD BE FALSE!! 
> g.save # => true   Oh Nos!!! 
+0

這是最有可能的,因爲每個權限被保存在同一交易(母公司)內。在rails文檔中:「對模型的所有更改(包括銷燬標記爲銷燬的模型)都會在保存父模型時自動保存和自動銷燬,這發生在由父保存方法啓動的事務內部。我的猜測是數據庫查找唯一性正在傳遞,因爲對象還沒有真正存儲。 – mnelson 2011-03-22 19:05:54

+0

你解決了這個問題嗎?我有同樣的事情http://stackoverflow.com/questions/8111424/uniqueness-validation-using-has-many-through-association – amree 2011-11-14 01:54:41

+0

對不起,長久以來忘了這個,還沒有研究到最終的解決方案爲我轉向其他事情。 – brad 2011-11-14 03:30:12

回答

0
class Group < AR 
    has_many :permissions 
    accepts_nested_attributes_for :permissions, :allow_destroy => true 
    validates_associated :permissions 
end 
+0

試過,沒有做任何事情,你建議它之前測試了嗎? – brad 2011-03-22 19:25:25

+0

你可以閱讀這個http://stackoverflow.com/questions/2102724/rails-nested-attributes-association-validation-failing – fl00r 2011-03-22 19:31:46

+0

這不是答案 – npiv 2011-05-05 18:44:53