Rails:用户特定的顺序列

时间:2013-11-01 03:48:36

标签: mysql ruby-on-rails ruby

我有一个库存系统,用户有很多库存。我们有一个条形码列,需要为每个用户提供顺序。

例如:

库存表:

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库存。即使批量添加库存,我如何确保库存具有独特的条形码?

3 个答案:

答案 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时也是如此。唯一的缺点就是要删除条形码存在验证器,但由于它是自动生成的,我们应该没问题。