Проверка достоверности данных

У меня есть три модели

Bid, Printer, Order

У принтера может быть много заявок, но только одна заявка.

У меня проблемы с подтверждением этого точного случая, a printer can have many bids, but only one bid per order

Есть ли какие-либо проверки, которые встроены в ActiveModel или ActiveRecord? Если нет никаких идей о том, как обеспечить принтер может иметь только одну ставку на заказ?

class Bid < ActiveRecord::Base
  belongs_to :printer
end

class Order < ActiveRecord::Base
  belongs_to :user
  has_many :bids
end

class Printer < ActiveRecord::Base
  has_many :orders, through: :bids
  has_many :bids
end

2 ответа

Там может быть более приятный способ сделать это, но вы всегда можете просто передать блок validate, Может как то так?

class Order < ActiveRecord::Base
  belongs_to :user
  has_many :bids
end

class Bid < ActiveRecord::Base
  belongs_to :printer
end

class Printer < ActiveRecord::Base
  has_many :orders, through: :bids
  has_many :bids

  validate do
    order_ids = orders.pluck(:bid_id)
    dups = order_ids.detect{ |id| order_ids.count(id) > 1 }
    errors.add(:bids, 'Only one order per bid per printer') if dups.any?
  end
end

принтер может иметь много ставок, но только одну ставку на заказ

Другими словами, значения пар (order_id, printer_id) должны быть уникальными в таблице ставок, верно? Таким образом, вам нужно только проверить уникальность (order_id, printer_id) в Bid модель как

validates :order_id, uniqueness: { scope: :printer_id }

Хорошо, чтобы уточнить мой ответ, у меня есть пример таблицы ставок здесь.

+--------+----------+------------+
| bid_id | order_id | printer_id |
+--------+----------+------------+
|      1 |        1 |          1 |
|      2 |        1 |          2 |
|      3 |        2 |          2 |
|      4 |        2 |          3 |
+--------+----------+------------+

Все хорошо: у принтера одна ставка на заказ. Но что произойдет, если мы добавим в таблицу запись типа [5, 2, 3]? Принтер с printer_id = 3 будет иметь 2 ставки (с bid_id = 4,5)! Условие точно такое же, что значения пар (order_id, printer_id) здесь не уникальны!

+--------+----------+------------+
| bid_id | order_id | printer_id |
+--------+----------+------------+
|      4 |        2 |          3 |
|      5 |        2 |          3 |
+--------+----------+------------+
Другие вопросы по тегам