Activerecord数据验证

时间:2015-11-19 03:37:01

标签: ruby-on-rails ruby activerecord activemodel

我有三个模特

BidPrinterOrder

打印机可以有多个出价但只有一个订单。

我无法验证确切的案例,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 个答案:

答案 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 |
+--------+----------+------------+