Rails 3.1验证多态关联的嵌套属性的唯一性

时间:2011-11-11 19:12:25

标签: ruby-on-rails-3 polymorphic-associations nested-attributes

鉴于以下模型:

##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是相同的,但没有抛出任何错误,并且line_items被添加到数据库中。如果发票是现有记录,则验证确实有效。

有什么想法吗?这是一个错误吗?

为防止出现错误数据,我添加了以下索引,但希望获得正确的rails验证

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

1 个答案:

答案 0 :(得分:0)

我想像你一样完全编码,但我发现绕过这个的唯一方法是在Invoice类中编写自定义验证。该解决方案的缺点是有问题的字段不会突出显示。