0

我有一个库存系统,其中一个用户有很多库存。我们有一个条形码列,每个用户需要按顺序排列。

例如:

库存表:

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

它通常可以工作,但是在为我的数据库播种时遇到了问题:

(1..5).each do
  user.inventories.build(...)
end
user.save

我最终得到了一堆user具有相同条形码的库存。即使在批量添加库存时,如何确保库存具有唯一的条形码?

4

3 回答 3

1

调用“build”将创建一个新的库存对象,但不会自动保存它。由于新创建的库存未保存到数据库中,因此您在方法“assign_barcode”中的查询将无法找到它们,这就是为什么它们都以相同的条形码结束: 1. @trh 建议的内容是正确的,您需要在构建库存后立即保存(inv.save 或 user.save 都可以)。

于 2013-11-01T09:26:39.083 回答
1

您可以在不保存嵌套用户对象的情况下构建和保存对象,这似乎干净地调用了您的验证方法。我很确定这不是预期的,但我正在为一个项目做类似的事情,并为相关数据播种。

就像是:

(1..5).each do
  inv = user.inventories.build
  inv.save
end
于 2013-11-01T04:25:33.893 回答
0

更改自:

before_validation :assign_barcode, on: :create

至:

before_create :assign_barcode

它现在按预期工作,即使添加许多.builds然后调用保存。唯一的缺点是必须删除条形码存在验证器,但由于它是自动生成的,我们应该没问题。

于 2013-11-01T20:48:16.533 回答