Rails 3.1 проверяет уникальность вложенных атрибутов для полиморфной ассоциации - PullRequest
2 голосов
/ 11 ноября 2011

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

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

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

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

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

1 Ответ

0 голосов
/ 04 января 2012

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

...