sql - rails bulk assigning sequence_numbers in console -
i'm trying assign incremental sequence number trades of users, each user have following:
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
and on.
i'm trying next command:
user.all.each { |u| u.trades.each_with_index {|t, i| t.sequence_number = i+1; t.save} }
it doesn't work though, console shows me ton of sql queries, rollbacks everything. here's 1 block sql queries:
(0.1ms) begin trade load (0.3ms) select `trades`.* `trades` trade load (0.2ms) select `trades`.* `trades` order `trades`.`id` desc limit 1 user load (0.1ms) select `users`.* `users` `users`.`id` = 1 limit 1 trade exists (0.2ms) select 1 1 `trades` (`trades`.`user_id` = binary 1 , `trades`.`id` != 18 , `trades`.`sequence_number` = 29) limit 1 (0.1ms) rollback
it's not updating thing.
if alter command to:
user.all.each { |u| u.trades.each_with_index {|t, i| puts [t.id, t.sequence_number = + 1].to_s} }
it prints correctly trade ids , sequence numbers:
[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]
but it's missing t.save
i've tried 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`.* `users` trade load (25.3ms) select `trades`.* `trades` `trades`.`user_id` = 1 (0.2ms) begin trade load (6.1ms) select `trades`.* `trades` trade load (0.4ms) select `trades`.* `trades` order `trades`.`id` desc limit 1 user load (0.3ms) select `users`.* `users` `users`.`id` = 1 limit 1 trade exists (11.2ms) select 1 1 `trades` (`trades`.`user_id` = binary 1 , `trades`.`id` != 1 , `trades`.`sequence_number` = 29) limit 1 (0.2ms) commit (0.1ms) begin trade load (0.3ms) select `trades`.* `trades` trade load (0.2ms) select `trades`.* `trades` order `trades`.`id` desc limit 1 user load (0.2ms) select `users`.* `users` `users`.`id` = 1 limit 1 trade exists (0.3ms) select 1 1 `trades` (`trades`.`user_id` = binary 1 , `trades`.`id` != 3 , `trades`.`sequence_number` = 29) limit 1 (0.2ms) rollback activerecord::recordinvalid: validation failed: user has been taken
the problem caused piece of code, responsible initializing sequence numbers objects:
trade definition contains:
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
and works :) thanks.
sql ruby-on-rails
No comments:
Post a Comment