2011-01-20 8 views
33

Esto puede sonar como una pregunta trivial, pero es bastante importante para las aplicaciones de cara al consumidoridentificadores de Mongo conduce a la URL de miedo

Cuál es la manera más fácil y más escalable para mapear el miedo Identificación del mongo en un ID que es ¿amistoso?

xx.com/posts/4d371056183b5e09b20001f9

A

xx.com/posts/a

M

+1

Se puede hacer referencia a este anuncio en Google Grupo: http://groups.google.com/group/mongoid/browse_thread/thread/b4edab1801ac75be/c810df90bb3a2145?lnk=gst&q=incremental#c810df90bb3a2145 A pesar de que en realidad no responde su pregunta, le ofrece algunas alternativas para resolver el problema. – siong1987

Respuesta

21

definir un campo único mascotas (como una babosa) en su colección, indexe, en su modelo, defina to_param para devolverlo:

def to_param 
    slug 
end 

Luego, en sus buscadores, se encuentran por pegarse en lugar de ID:

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

Esto le permitirá tratar a las babosas como su PK efectiva a los efectos de la interacción de los recursos, y son mucho más bonita.

+4

¿Por qué no utilizar el slug para el campo '_id'? Si va a ser único e indexado, no es necesario tener ambos. '_id' no se limita al tipo' ObjectId'. – Theo

+0

Buen punto. Eso funciona igual de bien. –

+4

Creo que porque la convención de mongodb es tener objectos reales en el campo _id. por ejemplo, mongoid usó identificadores de cadena por un tiempo http://www.mongodb.org/pages/viewpage.action?pageId=16646831 y causó problemas –

27

Puede crear una clave compuesta en MongoId para reemplazar el identificador predeterminado mediante la macro clave:

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" 

Si no te gusta esta manera de hacerlo, compruebe esta joya: https://github.com/hakanensari/mongoid-slug

+0

No se puede +1 suficiente, GRACIAS!(la cosa clave) –

+1

404 en el enlace. El enlace de Glenn funcionó bien. – MegaTux

4

Aquí hay una gran joya que he estado usando para responder con éxito a este problema: Mongoid-Slug

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

Proporciona una interfaz agradable para agregar esta característica en varios modelos. Si prefiere enrollar el suyo, al menos revise su implementación para algunas ideas. Si vas por esta ruta, mira dentro de la gema Stringex, https://github.com/rsl/stringex, y acuerda la biblioteca act_as_url. Eso te ayudará a obtener las lindas babosas entre las url.

+0

La URL de mongoid-slug lleva a un mensaje 404. –

+0

@JoseCarrilloThanks, lo arregló! – Glenn

7

Lamentablemente, la macro de claves se ha eliminado de mongo. Para los ID personalizados, los usuarios de ahora deben anular el campo _id.

class Band 
    include Mongoid::Document 
    field :_id, type: String, default: ->{ name } 
end 
+0

Esto tiene una cantidad de errores. Si no establece el 'nombre' al crear una instancia del objeto (Band.new), terminará con un nil' _id'. Establecer el '_id' luego no funciona. – Mohamad

Cuestiones relacionadas