Rails循环中断不断循环

时间:2018-10-15 07:14:04

标签: ruby-on-rails ruby-on-rails-5

我的试用模型中有一个方法,该方法采用season_year的后两位数字,并在最后由count方法生成一个唯一的数字。

除了我删除以前的记录外,其他所有操作都很好。

例如:说我创建了1800、1801和1802。删除1800并尝试创建新记录时,出现以下错误。

CACHE  (0.0ms)  SELECT COUNT(*) FROM "trials" WHERE "trials"."season_year" BETWEEN $1 AND $2  [["season_year", "2018-01-01"], ["season_year", "2018-12-31"]]
CACHE Trial Exists (0.0ms)  SELECT  1 AS one FROM "trials" WHERE "trials"."trial_number" = $1 LIMIT $2  [["trial_number", 1802], ["LIMIT", 1]]

出于某种原因,它不断循环播放上述内容。

我希望得到的结果是,检查数字是否存在,是否确实移动到下一个数字,但是由于某种原因,删除上一个记录后,该数字不起作用。

我要执行的操作是每次从00开始检查是否使用了数字。如果有,请转到下一个。即。 01

模型

class Trial < ApplicationRecord
before_create :create_trial_number

def count_records_from_same_year
    self.class.where(season_year: (season_year.beginning_of_year..season_year.end_of_year)).count
  end

  def create_trial_number
    loop do
      year = (season_year).strftime("%y")
      self.trial_number = year.concat(sprintf '%02d', count_records_from_same_year)
      break unless self.class.where(trial_number: self.trial_number).exists?
    end
  end
end

2 个答案:

答案 0 :(得分:0)

您发布的代码看起来是否会改变任何值以推进循环?我认为您需要在代码块末尾添加self.season_year += 1才能实现目标。

答案 1 :(得分:0)

您为试验创建唯一ID的方法非常无效。

您可以将trials表中的ID用作各个试验的唯一标识符。

或者,您可以让数据库创建一个自动递增的列。 MySQL使用AUTO_INCREMENT关键字,Postgres使用序列的概念。