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类中编写自定义验证。此解决方案有一个缺点,即有问题的字段不会突出显示。