繁体   English   中英

Rails在控制台中批量分配sequence_numbers

[英]rails bulk assigning sequence_numbers in console

我正在尝试为用户的交易分配递增的序列号,以便每个用户都具有以下内容:

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} }

它会正确打印交易编号和序列号:

[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

该问题是由另一段代码引起的,该代码负责初始化对象的序列号:

贸易定义现在包含:

  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

现在就可以了:)谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM