Rails 3:生成唯一代码(优惠券)

生成用作优惠券代码的唯一代码的最佳方法是什么?

谢谢。

你也可以这样做:

chars = ('a'..'z').to_a + ('A'..'Z').to_a def String.random_alphanumeric(size=16) (0...size).collect { chars[Kernel.rand(chars.length)] }.join end 

但是,您必须与数据库进行比较以确保它尚未使用。

从这里开始 。

在Ruby的标准库中有SecureRandom

 SecureRandom.hex(3) 

输出的长度是指定长度输入的两倍。

你想要的是生成一个GUID。 看这里:

ruby中的guid发生器

也许试试这个,似乎比仅仅生成一些随机密钥更有价值。 他们说:UUID生成器用于生成基于RFC 4122的通用唯一标识符(http://www.ietf.org/rfc/rfc4122.txt)。 http://rubygems.org/gems/uuid

 gem install uuid cd /myproject/path uuid-setup 

在你的代码中

 require_gem 'uuid' my_unique_id_var = UUID.new 

参考: http : //railsforum.com/viewtopic.php? id = 12616#p44545

如果你不想浪费与数据库的比较(不是一个超级昂贵的操作),你可以保证Time始终是唯一的,因为它只发生一次

 md5(Time.now.to_i.to_s+Time.now.usec.to_s) 

注意:有一个相同的问题

最近我写了优惠券代码gem ,完全一样。 该算法借鉴了Algorithm :: CouponCode CPAN模块。

优惠券代码不仅应该是唯一的,还应该易于阅读和打字,同时它仍然是安全的。 尼尔的解释和解决方案很棒。 这个gem提供了一种方便的方法和奖金validationfunction。

 >> require 'coupon_code' >> code = CouponCode.generate => "1K7Q-CTFM-LMTC" >> CouponCode.validate(code) => "1K7Q-CTFM-LMTC" >> CouponCode.validate('1K7Q-CTFM-LMTO') # Invalid code => nil