我有一个库存系统,用户有很多库存。我们有一个条形码列,需要为每个用户提供顺序。
例如:
库存表:
id | user_id | barcode
1 | 1 | 1
2 | 1 | 2
3 | 2 | 1
4 | 2 | 2
5 | 1 | 3
在库存模型中我有
before_validation :assign_barcode, on: :create
def assign_barcode
self.barcode = (user.inventories.order(barcode: :desc).first.try(:barcode) || 0) + 1
end
它通常有效,但在播种我的db时会遇到问题:
(1..5).each do
user.inventories.build(...)
end
user.save
我最终得到了一堆具有相同条形码的user
库存。即使批量添加库存,我如何确保库存具有独特的条形码?
答案 0 :(得分:1)
您可以在不保存嵌套用户对象的情况下构建和保存对象,这似乎可以干净地调用您的validate方法。我很确定这不是预期的,但是我正在为一个项目做类似的事情并且播种相关数据。
类似的东西:
(1..5).each do
inv = user.inventories.build
inv.save
end
答案 1 :(得分:1)
调用'build'将创建一个新的库存对象,但不会自动保存。由于新创建的库存未保存到数据库中,因此您在方法“assign_barcode”中的查询将无法找到它们,这就是为什么它们都会以相同的条形码结束:1。@trh建议的是正确的,您需要在构建它之后立即保存(inv.save或user.save会做)库存。
答案 2 :(得分:0)
更改自:
before_validation :assign_barcode, on: :create
为:
before_create :assign_barcode
并且它现在按预期工作,即使在添加许多.builds
然后调用save时也是如此。唯一的缺点就是要删除条形码存在验证器,但由于它是自动生成的,我们应该没问题。