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

ネストされたユーザーオブジェクトを保存せずに、オブジェクトを構築して保存できます。これにより、検証メソッドがきれいに呼び出されるようです。これは意図したとおりではないと確信していますが、プロジェクトに対して同様のことを行っており、関連データをシードしています。

何かのようなもの:

(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 に答える