Вставка уникальности Rails Build Association когда не существует - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть простая логика в небольшом приложении. У меня есть эта модель под названием "Oderne" (ordene.rb):

class Ordene < ApplicationRecord
    has_many   :ordernes_detalles
end

enter image description here

И деталь называется (ordernes_detalle.rb):

class OrdernesDetalle < ApplicationRecord
    belongs_to :ordene
    belongs_to :refaccione
end

enter image description here

Когда я создаю / обновляю ассоциацию записей, она выглядит следующим образом:

@order             = Ordene.new
    @order.folio       = SecureRandom.hex(4)
    @order.description = params[:description]
    @order.user_id     = 1
    @order.cliente_id  = params[:cliente_id]
    @order.reporte_id  = params[:reporte_id]
    params[:refaccione_id].each do |refaccion|
        @order.ordernes_detalles.build(
            :refaccione => Refaccione.find(refaccion),
            :tipo => 1
        )
    end
    if @order.save
        flash[:notice] = 'Orden creada correctamente'
        redirect_to action: 'index'
    else
        flash[:alert] = 'Error al crear la orden'
        redirect_to action: 'index'
    end

Ал отлично работает, а записи выглядят просто хорошо:

enter image description here

Вопрос в том, чтобы добавить это в мою модель "OrdenesDetalle":

class OrdernesDetalle < ApplicationRecord
    belongs_to :ordene
    belongs_to :refaccione
    validates_uniqueness_of :ordene, scope: :refaccione
end

Поэтому, когда я хочу обновить запись:

@order = Ordene.find(1)
        params[:refaccione_id].each do |refaccion|
            @order.ordernes_detalles.build(
                :refaccione => Refaccione.find(refaccion),
                :tipo => 1
            )
        end
        @order.save

Консоль показывает:

(0.3ms)  BEGIN
  ↳ app/controllers/ordenes_controller.rb:32
  OrdernesDetalle Exists (0.3ms)  SELECT  1 AS one FROM `ordernes_detalles` WHERE `ordernes_detalles`.`ordene_id` = 1 AND `ordernes_detalles`.`refaccione_id` = 1 LIMIT 1
  ↳ app/controllers/ordenes_controller.rb:32
  OrdernesDetalle Exists (0.2ms)  SELECT  1 AS one FROM `ordernes_detalles` WHERE `ordernes_detalles`.`ordene_id` = 1 AND `ordernes_detalles`.`refaccione_id` = 2 LIMIT 1
  ↳ app/controllers/ordenes_controller.rb:32
  OrdernesDetalle Exists (0.2ms)  SELECT  1 AS one FROM `ordernes_detalles` WHERE `ordernes_detalles`.`ordene_id` = 1 AND `ordernes_detalles`.`refaccione_id` = 3 LIMIT 1
  ↳ app/controllers/ordenes_controller.rb:32
   (0.1ms)  ROLLBACK

Запрос, который показывает, очевидно, не существует, но не вставляет запись, как я могу вставить эту запись, все еще избегая повторяющихся записей:

SELECT  1 AS one FROM `ordernes_detalles` WHERE `ordernes_detalles`.`ordene_id` = 1 AND `ordernes_detalles`.`refaccione_id` = 3 LIMIT 1

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...