2010-12-30 2 views
0

Я создал алгоритм URL Shortener с Рубином + MongoMapperRace состояние, алгоритм URL Shortener/Rails/MongoDB/MongoMapper

Это простой URL Shortener алгоритм с макс 3 цифры http://pablocantero.com/###

Где каждый # может быть [AZ] или [AZ] или [0-9]

для этого алгоритма, я должен сохраняться четыре атрибута на MongoDB (через MongoMapper)

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 

я создал еще один класс для управления ShortenerData и генерации уникального идентификатора

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

Shortener.instance.get_unique 

Мои сомнения, как я могу сделать get_unique синхронизированы, мое приложение будет развернуто на heroku, одновременные запросы могут вызвать Shortener.instance.get_unique

ответ

2

Я изменил поведение, чтобы получить base62 id. Я создал автоматическое приращение камень для MongoMapper

С авто увеличивается ид я закодировать в base62

Драгоценный камень доступен на GitHub https://github.com/phstc/mongomapper_id2

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

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

Использование

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

Short url

Я решил состояние гонки с MongoDB find_and_modify 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 

Если это новое поведение, я решил проблему гонки условие!

Если вам понравился этот драгоценный камень, пожалуйста, помогите улучшить его. Вы можете внести свой вклад и отправить их в качестве запроса на тягу или просто отправить мне сообщение http://pablocantero.com/blog/contato

Смежные вопросы