Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 断轨方法保持循环_Ruby On Rails - Fatal编程技术网

Ruby on rails 断轨方法保持循环

Ruby on rails 断轨方法保持循环,ruby-on-rails,Ruby On Rails,在试用模型中,我有一种方法,通过将年份的最后两位数字与从00开始的序列号连接起来,创建一个唯一的数字 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 loo

在试用模型中,我有一种方法,通过将年份的最后两位数字与从00开始的序列号连接起来,创建一个唯一的数字

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
如果我创建两个编号为1800、1801的试用版,然后删除1800,并尝试创建一个新的试用版,我希望它再次创建1800

但它似乎忽视了这一点。create_TREAT_number方法不会中断,并保持循环。我得到这个错误:

CACHE Trial Exists (0.0ms)  SELECT  1 AS one FROM "trials" WHERE "trials"."trial_number" = $1 LIMIT $2  [["trial_number", 1801], ["LIMIT", 1]]

可能有一种更为简化的方法。您从1800和1801两条记录开始

然后您删除了1800条,所以同一年的count_records_将返回1。您现在将获得一个自年以来的无限循环。concatsprintf“%02d”,同年的计数记录将计算为1801,该值已存在

如果要处理已删除试用号码的重新创建,请尝试以下操作

def create_trial_number
  current_count = count_records_from_same_year
  year = (season_year).strftime("%y")

  if current_count.zero?
    self.trial_number = year.concat(sprintf '%02d', current_count)
  else
    expected_trial_numbers = (0..current_count).map{|i| "#{year}#{sprintf '%02d', i}".to_i }
    existing_trial_numbers = self.class.where(season_year: (season_year.beginning_of_year..season_year.end_of_year)).order(:trial_number).pluck(:trial_number)

    self.trial_number = (expected_trial_numbers - existing_trial_numbers).first
  end
end

这可能与您遇到的问题无关,但我不太清楚为什么会出现循环和中断。当循环重新启动时,它看起来没有任何变化,所以如果它没有第一次中断,你总是会得到一个无限循环。对,我理解。如果已经创建了数字,那么中断意味着退出循环,但我明白你的意思。谢谢AbM。当创建试用时,这给了我1800、180001、18000102的数字。@DollarChills通过复制年份字符串添加了一个修复,因为concat变异了原始字符串现在最后两个数字似乎没有增加。刚刚创建了三条1800的记录。试用号在数据库中是字符串还是整数?它是整数。