2

鑑於以下型號:的Rails 3.1驗證嵌套屬性的唯一性態關聯

##Invoice.rb 
has_many :line_items, :as => :line_itemable 
accepts_nested_attributes_for :line_items 

##LineItem.rb 
belongs_to :line_itemable, :polymorphic => true 
validates :employee_id, :presence => true, :uniqueness => { :scope => [ :line_itemable_id, :line_itemable_type ] } 

我怎麼會去驗證了以下新的發票

i = Invoice.new 
i.line_items << [ LineItem.new(:employee_id => 1), LineItem.new(:employee_id => 1) ] 
i.valid? 

發票不應該是有效的,因爲line_items employee_id's是相同的,但沒有錯誤發生,line_items被添加到數據庫中。如果發票是現有記錄,則驗證確實有效。

任何想法?這是一個錯誤?

爲了防止壞的數據我已經添加了以下索引,但想有正確的軌道驗證

add_index :line_items, [ :employee_id, :line_itemable_type, :line_itemable_id ], :unique => true, :name => 'index_line_item_employee_id' 
+0

有沒有想過這個?我遇到了同樣的問題。這似乎是因爲line_itemable_id尚未填充且爲零,驗證不會失敗。 –

回答

0

我想爲你做了精確的代碼,但是,我覺得繞過這個問題的唯一辦法是在Invoice類中編寫自定義驗證。此解決方案有一個缺點,即有問題的字段不會突出顯示。