Рельсы 4.2, PostgreSQL 9.3
Модельные отношения:
class Nesting < ActiveRecord::Base
belongs_to :product
belongs_to :configurator, touch: true
validates :product_id, uniqueness: { scope: :configurator }
end
class Configurator < ActiveRecord::Base
has_many :nestings, dependent: :destroy
has_many :products, through: :nestings
accepts_nested_attributes_for :nestings, reject_if: :all_blank, allow_destroy: true
end
Ситуация, когда я создаю конфигуратор с продуктом foo
, а затем пытаюсь обновить его, чтобы добавить продукт foo
, работает нормально. Я получаю ошибку has_already_taken
.
Но когда я добавляю сразу два одинаковых продукта, проверки не работают. Как проверить уникальность product_id
в модели Nesting
в рамках Configurator
?
Мои взгляды довольно просты:
= simple_form_for @configurator, remote: true do |f|
= f.simple_fields_for :nestings do |nesting|
= render 'nesting_fields', f: nesting
= link_to_add_association 'add product', f, :nestings, class: 'btn btn-default'
= f.button :submit
_nesting_fields.html.slim
.nested-fields
.form-inline
= f.association :product, collection: @products
= link_to_remove_association f, class: 'btn btn-default' do
.glyphicon.glyphicon-remove
Одним из быстрых решений является проверка уникальности product_id's
в параметрах в действиях контроллеров. Но мне не нравится идея, что проверка происходит в действии контроллера.