0
我試圖分配增量的序列號,以我的用戶的交易,讓每一個用戶都會有類似如下:軌批量分配sequence_numbers控制檯
user 1
trade sequence 1
trade sequence 2
trade sequence 3
trade sequence 4
user 2
trade sequence 1
trade sequence 2
trade sequence 3
等。
我想用下面的命令來做到這一點:
User.all.each { |u| u.trades.each_with_index {|t, i| t.sequence_number = i+1; t.save} }
它不工作,雖然,控制檯顯示我確實一噸的SQL查詢,但回滾一切。這裏有一個SQL查詢塊:
(0.1ms) BEGIN
Trade Load (0.3ms) SELECT `trades`.* FROM `trades`
Trade Load (0.2ms) SELECT `trades`.* FROM `trades` ORDER BY `trades`.`id` DESC LIMIT 1
User Load (0.1ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
Trade Exists (0.2ms) SELECT 1 AS one FROM `trades` WHERE (`trades`.`user_id` = BINARY 1 AND `trades`.`id` != 18 AND `trades`.`sequence_number` = 29) LIMIT 1
(0.1ms) ROLLBACK
它沒有更新的東西。
如果我改變了命令:
User.all.each { |u| u.trades.each_with_index {|t, i| puts [t.id, t.sequence_number = i + 1].to_s} }
打印正確的交易ID和序列號:
[1, 1]
[3, 2]
[4, 3]
[5, 4]
[6, 5]
[7, 6]
[8, 7]
[9, 8]
[10, 9]
[12, 10]
[13, 11]
[14, 12]
[15, 13]
[16, 14]
[17, 15]
[18, 16]
[19, 17]
但它缺少t.save
我也試過與t.save!
:
User.all.each { |u| u.trades.each_with_index {|t, i| t.sequence_number = i+1; t.save!} }
User Load (57.9ms) SELECT `users`.* FROM `users`
Trade Load (25.3ms) SELECT `trades`.* FROM `trades` WHERE `trades`.`user_id` = 1
(0.2ms) BEGIN
Trade Load (6.1ms) SELECT `trades`.* FROM `trades`
Trade Load (0.4ms) SELECT `trades`.* FROM `trades` ORDER BY `trades`.`id` DESC LIMIT 1
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
Trade Exists (11.2ms) SELECT 1 AS one FROM `trades` WHERE (`trades`.`user_id` = BINARY 1 AND `trades`.`id` != 1 AND `trades`.`sequence_number` = 29) LIMIT 1
(0.2ms) COMMIT
(0.1ms) BEGIN
Trade Load (0.3ms) SELECT `trades`.* FROM `trades`
Trade Load (0.2ms) SELECT `trades`.* FROM `trades` ORDER BY `trades`.`id` DESC LIMIT 1
User Load (0.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
Trade Exists (0.3ms) SELECT 1 AS one FROM `trades` WHERE (`trades`.`user_id` = BINARY 1 AND `trades`.`id` != 3 AND `trades`.`sequence_number` = 29) LIMIT 1
(0.2ms) ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: User has already been taken
'trade.save'由於驗證錯誤而返回錯誤,請嘗試使用'trade.save!',這樣您就可以看到問題所在 – house9
謝謝,我已更新問題。 –