Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.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
Mysql RubyonRails:基于另一个字段的自定义字母数字id,并自动递增_Mysql_Ruby On Rails_Auto Increment - Fatal编程技术网

Mysql RubyonRails:基于另一个字段的自定义字母数字id,并自动递增

Mysql RubyonRails:基于另一个字段的自定义字母数字id,并自动递增,mysql,ruby-on-rails,auto-increment,Mysql,Ruby On Rails,Auto Increment,在开始之前,我必须说我是RubyonRails新手 我有一个名为Vendor的模型。我想要一个字段vendorid,它应该是一个字母数字字段。我想自动增加它 我还有一个城市,它是同一模型中的下拉选择字段。我希望我的vendorid在其值中使用该字段 例如:如果我的第一个供应商条目具有城市HYD,我希望我的供应商ID为HYD001,如果下一个条目具有城市DEL,则供应商ID应为DEL001,否则如果它再次具有HYD作为其城市,则应为HYD002 在网上搜索了很多之后,我找到了gemprotokol

在开始之前,我必须说我是RubyonRails新手

我有一个名为Vendor的模型。我想要一个字段vendorid,它应该是一个字母数字字段。我想自动增加它

我还有一个城市,它是同一模型中的下拉选择字段。我希望我的vendorid在其值中使用该字段

例如:如果我的第一个供应商条目具有城市HYD,我希望我的供应商ID为HYD001,如果下一个条目具有城市DEL,则供应商ID应为DEL001,否则如果它再次具有HYD作为其城市,则应为HYD002

在网上搜索了很多之后,我找到了gemprotokoll。但我认为即使这样也无助于我的处境

class Vendor < ActiveRecord::Base    
    protokoll :vendorid, :pattern => city + "###"
end
类供应商city+“#”
结束
我也尝试过:

:pattern=>“#{city}###” :pattern=>self.city+“###”

它向我抛出一个错误“类:0xb61c4150的未定义方法'city'”


谢谢你的帮助。

暂时忘记Protokoll,我认为这应该行得通

class Vendor
  before_create :set_unique_vendorid

  def set_unique_vendorid
    if last_vendor = Vendor.find(:last, :order => "id", :conditions => ["vendorid like ?", "#{self.city}%"])
      last_vendorid_number = last_vendor.vendorid.scan(/\d+$/).first.to_i
      new_vendorid_number = last_vendorid_number + 1
    else
      new_vendorid_number = 1
    end
    self.vendorid = "#{self.city}#{sprintf("%03d", new_vendorid_number)}"
  end
sprintf
位将把新的供应商ID号转换成一个三位数的字符串(如“002”),它看起来像是您的需求


注意:如果一台服务器运行多个rails实例,并且其中两个实例试图同时创建一个新的供应商对象,那么这里就有一个潜在的竞争条件。但是如果你已经成功了,你需要担心这一点,那么你可以用事务或其他东西来重构它:O

Protokoll看起来可以做你想做的事情(不过我自己没有用过)。Protokoll有什么问题吗?我编辑了这篇文章,展示了我对Protokoll所做的工作以及我的结果。在你的代码中,rails加载时,“city”在类级别使用。它不知道此时的城市是什么。看起来您试图猜测Protokoll的语法,告诉它使用city值而不是固定字符串。这可能是不可能的,但如果是这样的话,那肯定不是正确的语法。同样的问题:“self”是类。没有
Vendor.city
方法。嗨,Max,非常感谢您的解决方案,我一直在自己尝试,并做了一些与您类似的事情。我不知道这是否是正确的解决方案,但它给了我正确的答案。我得到了类似“count=vendorid.count(:conditions=>[“city==?”,city])的计数,并将其添加到101,而不是上一个\u ventorid\u编号。这有什么后果吗?正如我之前告诉过你的,我对这一切都很陌生。基于
count
不能保证唯一性。例如:您创建了第一个HYD供应商,它将获得vendorid=“HYD101”。如果在HYD中生成另一个,则会得到vendorid=“HYD102”。删除第一个供应商。如果您创建了另一个供应商,它将获得vendorid=“HYD102”,因为count=1。现在有两个供应商具有相同的vendorid。在我的方法下,每个vendorid总是比那个城市的最后一个高1。而且他们从001开始,这不会让人们认为在那个城市已经有100家其他供应商了!还有一件事,在第二行的方法中,它应该是“last\u vendorid\u number=last\u vendorid.vendorid.scan(/\d+$/).first.to\i”。你错过了文多利德。现在很好用。再次感谢。啊,是的,对不起。实际上,我的做法与你的建议略有不同,如果找不到供应商,建议就会失效。我已经编辑了我的答案。