代码之家  ›  专栏  ›  技术社区  ›  DollarChills

断轨方法保持循环

  •  0
  • DollarChills  · 技术社区  · 7 年前

    在里面 Trial 模型中,我有一种方法,通过将年份的最后两位数字与从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_trial_number 方法不会中断,并保持循环。我得到这个错误:

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   AbM    7 年前

    你从1800和1801两张唱片开始。

    然后你删除了1800,所以 count_records_from_same_year year.concat(sprintf '%02d', count_records_from_same_year) 将计算到已存在的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