我有三个模特
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
答案 0 :(得分:0)
可能有一种更为流畅的方法,但你总是可以将一个块传递给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
答案 1 :(得分:0)
打印机可以有多个出价,但每个订单只有一个出价
换句话说,对的值(order_id,printer_id)在出价表中必须是唯一的,对吧?所以你只需要在Bid
模型中验证(order_id,printer_id)的唯一性,如
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 |
+--------+----------+------------+