Монго идентификаторы приводят к страшным URL - PullRequest
33 голосов
/ 20 января 2011

Это может звучать как тривиальный вопрос, но довольно важно для приложений, ориентированных на потребителя.

Какой самый простой и самый масштабируемый способ сопоставить страшный идентификатор монго с дружественным идентификатором?

xx.com / posts / 4d371056183b5e09b20001f9

TO

xx.com / posts / a

M

Ответы [ 4 ]

27 голосов
/ 11 февраля 2011

Вы можете создать составной ключ в mongoid, чтобы заменить идентификатор по умолчанию, используя макрос ключа:

class Person
  include Mongoid::Document
  field :first_name
  field :last_name
  key :first_name, :last_name
end

person = Person.new(:first_name => "Syd", :last_name => "Vicious")
person.id # returns "syd-vicious"

Если вам не нравится этот способ, проверьте этот драгоценный камень: https://github.com/hakanensari/mongoid-slug

21 голосов
/ 20 января 2011

Определите дружественное уникальное поле (например, слизняк) в вашей коллекции, индексируйте его, в вашей модели определите to_param, чтобы вернуть:

def to_param
  slug
end

Тогда в ваших поисках найдите по слагу, а не по ID:

@post = Post.where(:slug => params[:id].to_s).first

Это позволит вам рассматривать слизней как эффективный ПК для взаимодействия с ресурсами, и они намного красивее.

8 голосов
/ 01 августа 2012

К сожалению, ключевой макрос был удален из Монго. Для пользовательских идентификаторов, Теперь пользователи должны переопределить поле _id.

class Band
  include Mongoid::Document
  field :_id, type: String, default: ->{ name }
end
4 голосов
/ 31 октября 2011

Вот замечательный драгоценный камень, который я использовал для успешного решения этой проблемы: Mongoid-Slug

https://github.com/digitalplaywright/mongoid-slug.

Он предоставляет приятный интерфейс для добавления этой функции черезнесколько моделей.Если вы предпочитаете накатывать свои собственные, по крайней мере, проверьте их реализацию для некоторых идей.Если вы идете по этому пути, посмотрите на гем Stringex, https://github.com/rsl/stringex, и библиотеку acts_as_url внутри.Это поможет вам получить хорошие слизни между тире.

...