2010-12-30 11 views
0

私はルビー+ MongoMapperレース条件、URL短縮アルゴリズム/レール/ MongoDBの/ MongoMapper

とURL短縮アルゴリズムを作成したことが最大各#は可能3桁 http://pablocantero.com/###

とシンプルなURL短縮アルゴリズムです[AZ]または[AZ]又は[0-9]

このアルゴリズムについては、私は( MongoMapper介して)MongoDBの上に4つの属性

class ShortenerData 
    include MongoMapper::Document 
    VALUES = ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a 
    key :col_a, Integer 
    key :col_b, Integer 
    key :col_c, Integer 
    key :index, Integer 
end 
を永続化する必要があります

私は、私の疑問は、私が同期get_unique作ることができ、私のアプリは を展開する方法であるユニークな 識別子

class Shortener 
    include Singleton 

    def get_unique 
    unique = nil 
    @shortener_data.reload 
    # some operations that can increment the attributes col_a, col_b, col_c and index 
    # ... 
    @shortener_data.save 
    unique 
    end 
end 

短縮の使用

Shortener.instance.get_unique 

を生成するShortenerDataを管理するために別のクラスを作成し、ヒロクでは、同時リクエストでも電話できます Shortener.instance.get_unique

答えて

2

base62 id。私はbase62にエンコード自動インクリメントIDで

をMongoMapperする自動インクリメントの宝石を作成し

逸品使用

movie = Movie.create(:title => 'Tropa de Elite') 
movie.id # BSON::ObjectId('4d1d150d30f2246bc6000001') 
movie.id2 # 3 
movie.to_base62 # d 

# app/models/movie.rb 
class Movie 
    include MongoMapper::Document 

    key :title, String 
    # Here is the mongomapper_id2 
    auto_increment! 
end 

GitHubのhttps://github.com/phstc/mongomapper_id2で提供されています短いURL

私はレースコンディションの問題を解決し、この新しい動作した場合、私はhttp://www.mongodb.org/display/DOCS/findAndModify+Command

model = MongoMapper.database.collection(:incrementor). 
    find_and_modify(
    :query => {'model_name' => 'movies'}, 
    :update => {'$inc' => {:id2 => 1}}, :new => true) 

model[:id2] # returns the auto incremented_id 

find_and_modifyのMongoDBとの競合状態を解決!

この宝石が好きだったら、改善してください。あなたの貢献をしてプルリクエストとして送信するか、私にメッセージを送ってください。http://pablocantero.com/blog/contato