Проверка достоверности данных
У меня есть три модели
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 |
+--------+----------+------------+