2011-01-20 12 views
33

यह एक तुच्छ सवाल की तरह ध्वनि हो सकता है की ओर जाता है, लेकिन यह उपभोक्ता का सामना करना पड़ क्षुधामोंगो आईडी डरावना यूआरएल

सबसे आसान तरीका है और सबसे स्केलेबल रास्ता एक आईडी है कि पर डरावना मोंगो आईडी मैप करने के लिए क्या है के लिए नहीं बल्कि महत्वपूर्ण है अनुकूल?

xx.com/posts/4d371056183b5e09b20001f9

को

xx.com/posts/a

एम

+1

आप Google समूह में इस पोस्ट का उल्लेख कर सकते हैं: http://groups.google.com/group/mongoid/browse_thread/thread/b4edab1801ac75be/c810df90bb3a2145?lnk=gst&q=incremental#c810df90bb3a2145 यहां तक ​​कि यह हालांकि वास्तव में आपके प्रश्न का उत्तर नहीं देता है, यह आपको समस्या को हल करने के लिए कुछ विकल्प देता है। – siong1987

उत्तर

21

एक दोस्ताना अद्वितीय क्षेत्र (एक स्लग की तरह) को परिभाषित करें अपने संग्रह पर, इसे अपने मॉडल पर, to_param को इसे वापस करने के लिए परिभाषित करें:

def to_param 
    slug 
end 

फिर अपने ढूँढ़ने में, आईडी के बजाय काउंटर से लगता है:

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

यह आपको संसाधन बातचीत के प्रयोजनों के लिए अपने प्रभावी पी के रूप में मल का इलाज है, और वे एक बहुत खूबसूरत हो करने देगा।

+4

'_id' फ़ील्ड के लिए स्लग का उपयोग क्यों नहीं करें? यदि यह अद्वितीय और अनुक्रमित होने जा रहा है, तो दोनों को रखने की आवश्यकता नहीं है। '_id'' ऑब्जेक्ट आईडी 'प्रकार तक ही सीमित नहीं है। – Theo

+0

अच्छा बिंदु। यह भी काम करता है। –

+4

मुझे लगता है क्योंकि mongodb सम्मेलन _id फ़ील्ड में वास्तविक ऑब्जेक्ट्स होना है। उदाहरण के लिए, थोड़ी देर के लिए mongoid स्ट्रिंग आईडी का इस्तेमाल किया http://www.mongodb.org/pages/viewpage.action?pageId=16646831 और इससे –

27

आप डिफ़ॉल्ट आईडी कुंजी मैक्रो का उपयोग बदलने के लिए mongoid में एक समग्र कुंजी बना सकते हैं: https://github.com/hakanensari/mongoid-slug

+0

इसे पर्याप्त +1 नहीं कर सकता, धन्यवाद!(मुख्य चीज़) –

+1

लिंक पर 404। ग्लेन के लिंक ने ठीक काम किया। – MegaTux

4

: आप इस तरह से यह करने के लिए पसंद नहीं है

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" 

, इस मणि की जाँच यहां एक महान मणि है जिसका उपयोग मैं इस समस्या का सफलतापूर्वक उत्तर देने के लिए कर रहा हूं: Mongoid-Slug

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

यह इस सुविधा को कई मॉडलों में जोड़ने के लिए एक अच्छा इंटरफ़ेस प्रदान करता है। यदि आप अपने आप को रोल करना चाहते हैं, तो कम से कम कुछ विचारों के लिए उनके कार्यान्वयन की जांच करें। यदि आप इस मार्ग पर जा रहे हैं, तो स्ट्रिंगेक्स मणि, https://github.com/rsl/stringex, और act_as_url लाइब्रेरी को अंदर देखें। इससे आपको अच्छे डैश-बीच-यूआरएल स्लग प्राप्त करने में मदद मिलेगी।

+0

मोंगॉयड-स्लग के लिए यूआरएल 404 संदेश की ओर जाता है। –

+0

@ जोस कैरिलो धन्यवाद, इसे ठीक करें! – Glenn

7

दुर्भाग्य से, मुख्य मैक्रो को मोंगो से हटा दिया गया है। कस्टम आईडी के लिए, उपयोगकर्ताओं को अब _id फ़ील्ड को ओवरराइड करना होगा।

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

इसमें कई गॉथस हैं। यदि आप ऑब्जेक्ट को तुरंत चालू करते समय 'name' सेट नहीं करते हैं (बैंड.न्यू) तो आप शून्य '_id' के साथ समाप्त हो जाएंगे। '_id' को बाद में सेट करना काम नहीं करता है। – Mohamad

संबंधित मुद्दे