原来有一个名为 base62 的 gem 完全符合我的描述:
https://github.com/jtzemp/base62
require 'base62'
>> 635.base62_encode
=> "AF"
>> "AF".base62_decode
=> 635
我还使用一个模块使其特定于 rails,该模块可以混合到任何需要混淆/缩短的模型中:
module AdditionalMethods
module Shortener
def short_id
self.id.base62_encode
end
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def original_id(string)
string.base62_decode
end
def find_by_short_id(string)
self.find_by_id(self.original_id(string))
end
end
end
end
Post.rb
class Post < ActiveRecord::Base
include AdditionalMethods::Shortener
...
end
然后
>> @post.id
=> 52
>> @post.short_id
=> "q"
>> Post.original_id("q")
=> 52
>> Post.find_by_short_id("q")
=> #<Post id: 52 ... >