在开始之前,我必须说我是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;
感谢您的帮助。
答案 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