Идентификаторы Mongo ведут к страшным URL-адресам

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

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

xx.com/posts/4d371056183b5e09b20001f9

TO

xx.com/posts/a

M


person ming yeow    schedule 20.01.2011    source источник
comment
Вы можете обратиться к этому сообщению в группе Google: groups.google.com/group/mongoid/browse_thread/thread/ Несмотря на то, что он на самом деле не отвечает на ваш вопрос, он дает вам несколько вариантов решения проблемы.   -  person siong1987    schedule 21.01.2011


Ответы (4)


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

def to_param
  slug
end

Затем в поисковых системах найдите по слагу, а не по идентификатору:

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

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

person Chris Heald    schedule 20.01.2011
comment
Почему бы даже не использовать слаг для поля _id? Если он будет уникальным и проиндексированным, нет необходимости иметь и то, и другое. _id не ограничивается типом ObjectId. - person Theo; 21.01.2011
comment
Я думаю, потому что соглашение mongodb состоит в том, чтобы иметь реальные идентификаторы объектов в поле _id. например, mongoid некоторое время использовал строковые идентификаторы mongodb.org/pages/viewpage. action?pageId=16646831 и вызвало проблемы - person Scott Schulthess; 25.01.2011
comment
что с эффективностью? не займет ли поиск длинной строки слаг дольше, чем поиск по идентификатору? - person eagor; 24.10.2014
comment
@eagor Если вы ищете в поле, вы должны проиндексировать это поле. В этот момент это должно быть примерно так же дорого, как поиск документа с заданным идентификатором. - person Chris Heald; 24.10.2014

Вы можете создать составной ключ в 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

person kerberoS    schedule 11.02.2011
comment
Не могу добавить +1, СПАСИБО! (ключевая вещь) - person Francisco Aquino; 16.04.2011

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

class Band
  include Mongoid::Document
  field :_id, type: String, default: ->{ name }
end
person styliii    schedule 01.08.2012
comment
Это имеет ряд ошибок. Если вы не установите name при создании экземпляра объекта (Band.new), вы получите nil _id. Установка _id после этого не работает. - person Mohamad; 06.02.2014

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

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

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

person Glenn    schedule 31.10.2011
comment
URL для mongoid-slug ведет к сообщению 404. - person Jose Carrillo; 14.11.2015
comment
@JoseCarrilloСпасибо, исправил! - person Glenn; 16.11.2015