2011-01-20 9 views
33

questo potrebbe sembrare una domanda banale, ma è piuttosto importante per i consumatori di fronte applicazioniMongo ids porta a URL spaventosi

Qual è il modo più semplice e il modo più scalabile per mappare la paura mongo id su un ID che è amichevole?

xx.com/posts/4d371056183b5e09b20001f9

PER

xx.com/posts/a

M

+1

È possibile fare riferimento a questo post al gruppo Google: http://groups.google.com/group/mongoid/browse_thread/thread/b4edab1801ac75be/c810df90bb3a2145?lnk=gst&q=incremental#c810df90bb3a2145 Anche se in realtà non risponde alla tua domanda, ti dà alcune alternative per risolvere il problema. – siong1987

risposta

21

Definire un campo univoco accogliente (come una lumaca) sulla tua raccolta, indicalo, sul tuo modello, definisci to_param per restituirlo:

def to_param 
    slug 
end 

Poi, nel tuo cercatori, Ricerca per slug piuttosto che ID:

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

Questo vi permetterà di trattare lumache come PK efficace ai fini di interazione delle risorse, e sono molto più bella.

+4

Perché non utilizzare nemmeno lo slug per il campo '_id'? Se sarà unico e indicizzato, non è necessario averli entrambi. '_id' non è limitato al tipo' ObjectId'. – Theo

+0

Buon punto. Funziona altrettanto bene. –

+4

Penso che la convenzione di mongodb abbia degli oggetti reali nel campo _id. ad esempio, mongoid ha usato id di stringa per un po 'http://www.mongodb.org/pages/viewpage.action?pageId=16646831 e ha causato problemi –

27

È possibile creare una chiave composta in mongoid per sostituire l'ID predefinito utilizzando la macro chiave:

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" 

Se non ti piace questo modo di farlo, controllare questo gioiello: https://github.com/hakanensari/mongoid-slug

+0

Impossibile fare +1 su questo, GRAZIE!(the key thingie) –

+1

404 sul link. Il link di Glenn ha funzionato bene. – MegaTux

4

Ecco un grande gioiello che ho utilizzato per rispondere con successo a questo problema: Mongoid-Slug

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

Fornisce una bella interfaccia per l'aggiunta di questa funzionalità su più modelli. Se preferisci lanciare il tuo, controlla almeno la loro implementazione per alcune idee. Se stai seguendo questa rotta, guarda all'interno della gemma Stringex, https://github.com/rsl/stringex e la libreria acts_as_url. Ciò ti aiuterà a ottenere le simpatiche slug dash-between-url.

+0

L'url per mongoid-slug porta a un messaggio 404. –

+0

@JoseCarrilloThanks, risolto! – Glenn

7

Sfortunatamente, la macro chiave è stata rimossa da mongo. Per gli ID personalizzati, gli utenti devono ora sovrascrivere il campo _id.

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

Questo ha un numero di trucchi. Se non si imposta il 'nome' quando si crea un'istanza dell'oggetto (Band.new) si finisce con un' _id' nullo. L'impostazione di '_id' in seguito non funziona. – Mohamad