2010-08-03 9 views
10

मैं इस तरह एक ActiveRecord मॉडल है:क्या रेल-एक्टिव रिकॉर्ड्स माइग्रेशन के माध्यम से फ़ंक्शन-आधारित डेटाबेस-अज्ञेय अनुक्रमणिका को जोड़ना संभव है?

create_table "books" do |t| 
    t.string "title" 
end 

class Book < ActiveRecord::Base 
    default_scope :order => 'lower(title) DESC' 
end 

आप देख सकते हैं मैं title विशेषता का लोअरकेस रूप से क्रमबद्ध करना चाहते हैं, लेकिन यह एक प्रदर्शन डेटाबेस स्तर पर मारा लगाता है के रूप में। इस हिट को विभिन्न डेटाबेस के साथ विभिन्न तरीकों से उपचार किया जा सकता है। उदाहरण के लिए, PostgreSQL या Oracle में आप एक समारोह आधारित सूचकांक बनाने के लिए:

CREATE INDEX lowercase_book_title_index ON book (lower(title)); 

SQLite3 समारोह आधारित अनुक्रमित नहीं है तो आप एक मिलान निर्दिष्ट करने के लिए है:

CREATE INDEX lowercase_book_title_index ON book (title COLLATE NOCASE); 

मुझे नहीं है यह देखा कि आप इसे MySQL के साथ कैसे करते हैं लेकिन मुझे यकीन है कि एक तरीका है (collations? वर्चुअल कॉलम?)।

किसी भी घटना में मैं डेटाबेस-अज्ञेय प्रवासन के साथ उचित रेल फैशन में ऐसा करना चाहता हूं। मैं निश्चित रूप से इस तरह एक साधारण सूचकांक बना सकता हूं:

add_index :books, :title 

लेकिन यह उत्पन्न सूचकांक केस-संवेदी है। मुझे एहसास है कि मैं डेटाबेस-निर्भर माइग्रेशन लिख सकता हूं, लेकिन यह बहुत ही सुरुचिपूर्ण नहीं है। यह व्यावहारिक भी नहीं है - मैं अक्सर अपने विकास कार्यस्थानों और उत्पादन में PostgreSQL पर SQLite3 का उपयोग कर खुद को पाता हूं। इंडेक्स नाम, विशिष्टता, और लंबाई के साथ add_index सौदा के लिए उपलब्ध विकल्प। क्या मैं यहां जो करने की कोशिश कर रहा हूं उसे पूरा करने के लिए एक तरीका देख रहा हूं?

+0

सीधे आपके प्रश्न से संबंधित नहीं है, लेकिन उत्पादन में SQLite का उपयोग करके और उत्पादन में PostgreSQL का उपयोग बहुत दुख का कारण बनता है। (यह Heroku उपयोगकर्ताओं को बहुत काटता है। ए * बहुत *।) PostgreSQL भी मुफ़्त है, इसलिए यह वास्तव में SQLite के खिलाफ विकसित करने के लिए समझ में नहीं आता है। –

+0

यह मेरे लिए आश्चर्यजनक रूप से दर्द रहित है, बशर्ते मैंने ActiveRecord को SQL लिखने दें। यह तब नहीं था जब मैं MySQL के खिलाफ विकास कर रहा था और फिर PostgreSQL पर तैनात किया गया था। – Sven

उत्तर

0

मुझे इस तरह के सॉर्टिंग के साथ कभी भी कोई समस्या नहीं थी। असल में, क्या आप चाहते हैं कि परिणाम इस तरह से हल कर रहे हैं है:

"A bad title" 
"A better title" 
"a good title" 
"An excellent title" 

यदि यह सही है और आप mysql के साथ जा रहे हैं, तो आप अपने database.yml में एक मिलान निर्दिष्ट कर सकते हैं, की कोशिश:

production: 
    adapter: mysql2 # or mysql for rails < 3 
    host: ... 
    database: ... 
    username: ... 
    encoding: utf8 # or whatever you are using 
    collation: utf8_general_ci # or whatever fits your language and encoding 

utf8_general_ci का अर्थ है "एक भाषा में स्वतंत्र तरीके से utf8 के साथ collate और केस असंवेदनशील हो"।

यह चाल करना चाहिए।

+1

यह सच है, और आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन मैं इसे करने का डेटाबेस-_agnostic_ तरीका ढूंढ रहा था। यही है, केवल एक रेल माइग्रेशन एक बना सकता है: बाइनरी कॉलम जो MySQL या PostgreSQL में बाइटा में ब्लॉब बन जाता है, मैं अपने रेल माइग्रेशन में एक केस-असंवेदनशील इंडेक्स निर्दिष्ट करने में सक्षम होना चाहता हूं जो उचित तरीके से संभाला जाता है डेटाबेस में। – Sven

+0

मैं एक ही समस्या में देख रहा हूँ, क्या आपको समाधान मिला? 'निचले' विकल्प के साथ default_scope का उपयोग करना एक महत्वपूर्ण प्रदर्शन प्रभाव है? –

1

लघु जवाब: नहीं

लांग जवाब: नहीं, क्योंकि सभी डेटाबेस इंजन इसे समर्थन क्या समर्थन करता है रेल, या एक बहुत ही अलग तरीके से। यदि आप सुनिश्चित हैं कि सभी डेटाबेस इंजन इसका समर्थन करते हैं, तो ActiveRecord डेवलपर्स के लिए एक सुविधा अनुरोध दर्ज करें।

अपने दिमाग में रखें: ActiveRecord माइग्रेशन में, आप केवल वही कर सकते हैं जो सभी डेटाबेस इंजन का समर्थन करता है, डेटाबेस-विशिष्ट सामग्री को माइग्रेशन से अलग प्रारंभिकताओं की आवश्यकता होती है।

मैं इस संग्रह को अलग-अलग रेक कार्य से स्थापित करने की अनुशंसा करता हूं जो डीबी के बाद चलता है: माइग्रेट करें। मेरे बड़े अनुप्रयोगों में मैं rake setup का उपयोग करता हूं जहां मैं यह विशिष्ट कदम उठा सकता हूं।

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