Ruby on Rails:基于另一个字段的自定义字母数字id并自动递增它

时间:2014-04-07 12:10:25

标签: mysql ruby-on-rails auto-increment

在开始之前,我必须说我是Ruby on rails的新手。

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

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

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

在网上搜索了很多,我发现了宝石 protokoll 。但我认为即使这样也无助于我的情况。

class Vendor < ActiveRecord::Base    
    protokoll :vendorid, :pattern => city + "###"
end

我也尝试过:

:pattern =&gt; &#34;#{城市} ###&#34; :pattern =&gt; self.city +&#34; ###&#34;

它给我一个错误&#34;未定义的方法`city&#39; #Class:0xb61c4150&#34;

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

暂时忘记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位会将new_vendorid_number转换为三位数的字符串(例如&#34; 002&#34;),它看起来像是您的要求。

注意:如果您的服务器运行多个rails实例,并且其中两个尝试同时创建新的Vendor对象,则此处存在潜在竞争条件。但是如果你达到了如此成功的程度,你需要担心这一点,那么你可以用事务或其他东西来重构它:O