2014-06-19 32 views
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 
+0

'trade.save'由於驗證錯誤而返回錯誤,請嘗試使用'trade.save!',這樣您就可以看到問題所在 – house9

+0

謝謝,我已更新問題。 –

回答

0

的問題所造成的另一段代碼,負責初始化序列號的對象:

貿易的定義現在包含:

before_validation :assign_sequence_number 

    def assign_sequence_number 
    unless sequence_number 
     self.sequence_number = Trade.all.empty? ? 1 : Trade.last.sequence_number + 1 
    end 
    end 

,現在工程:)感謝。