Rails 3.1 проверяет уникальность вложенных атрибутов для полиморфной ассоциации

#ruby-on-rails-3 #polymorphic-associations #nested-attributes

#ruby-on-rails-3 #полиморфные ассоциации #вложенные атрибуты

Вопрос:

Учитывая следующие модели:

 ##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 совпадают, и при этом ошибка не выдается, а line_items добавляются в базу данных. Если счет-фактура является существующей записью, проверки действительно работают.

Есть идеи? Это ошибка?

Для предотвращения неверных данных я добавил следующий индекс, но хотел бы иметь надлежащие проверки rails

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

Комментарии:

1. Вы когда-нибудь понимали это? Я только что столкнулся с той же проблемой. Похоже, что из-за того, что line_itemable_id еще не заполнены и равны нулю, проверка не завершается ошибкой.

Ответ №1:

Я хотел бы кодировать точно так, как вы делали, но единственный способ обойти это, который я нашел, — написать пользовательскую проверку в классе Invoice. Это решение имеет недостаток, заключающийся в том, что проблемные поля не выделяются.