关于在Ruby on Rails中实现代理键的问题

时间:2012-02-25 16:08:45

标签: ruby-on-rails

对于即将推出的项目,我们需要拥有唯一的真实世界标识符,这些标识符会向用户显示帐号或案例编号(如错误跟踪ID)。这些将始终是系统生成的和不可更改的。现在我们计划严格按照Heroku运行。

虽然(正如我的名字所暗示的)我对Ruby on Rails的精彩态度不熟悉,但我在企业应用程序开发方面有很长的背景。我正试图在过去做“RoR方式”的过程中弥合我所做的事情

显然,RoR拥有出色的主键支持。我在这里阅读了几十篇文章,建议调整业务需求,只使用开箱即用的id / key方法。

因此,让我描述一下我想要完成的事情,如果您遇到类似的目标和采取的方法,请告诉我。

1)希望拥有一个长度一致的人类可读密钥。始终拥有相同长度的帐户ID或交易ID是有价值的(对于表单验证,培训销售人员等)使用Ruby的先天密钥生成可以添加缓冲区字符(例如100000而不是1)。

2)紧凑性:我的初步计划是使用基本36唯一键(例如36个值[0..9],[a..z])。作为API /接口的一部分,我们计划基于简短的URL(例如xx.co/000001)公开某些非机密对象。我喜欢能够在基数36中使用五个字符标识符而在十进制中使用7+的想法。

所以我可以想到两种可能的方法: a)添加我自己的字段并开发我自己独特的密钥生成器(或者有人会指向我一个)。

b)填充前导数字(我假设我可以强制唯一密钥生成从1xxxxxxx而不是0000001开始)。然后使用to_s(36)方法将其转换为与基础36之间的转换,以便与人类进行所有交互。甚至可能将基本36格式的实际ID值存储在数据库中以避免持续转换,但始终在查询之前进行转换以避免需要另外的索引。

我倾向于接近B,因为从数据库性能的角度看它似乎是最优的,并且它需要对非增值开销的最少投资。再一次,非常感谢任何有关这些主题的真实世界经验和对最佳方法的想法。

提前致谢!

1 个答案:

答案 0 :(得分:2)

我永远不会在Rails表中使用主键来处理任何重要的业务。有一天,业务端的某个人会想要改变它,它最终将成为一个巨大的痛苦的屁股,并将使你和你的用户认为是规范的一堆网站无效,并且会弄乱你的所有网址外键和等等等等。这只是一个非常糟糕的主意,我鼓励你不要这样做。

Rails执行此操作的方法是使用一个新列,称为number或bug_tracking_number,或者您喜欢的任何内容,before_validation实现一个为其赋值的回调。这是你可以让你的创造力发光的地方;这样的事情听起来像你想要的那样:

before_validation( :on => :create ) do 
  self.number = CaseNumber.count + 1
end

您可以在那里填写数字,确保其独特性,或做任何您想做的事情。