Ruby on rails 断轨方法保持循环
在试用模型中,我有一种方法,通过将年份的最后两位数字与从00开始的序列号连接起来,创建一个唯一的数字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
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的记录。试用号在数据库中是字符串还是整数?它是整数。