हां, वह सत्यापन उस तरह की क्वेरी करेगा और उस तरह की क्वेरी एक टेबल स्कैन करने वाली है।
आपको वास्तव में यहां कुछ समस्याएं हैं:
- सत्यापन दौड़ की स्थिति के अधीन है क्योंकि तर्क उस डेटाबेस में नहीं है जहां यह संबंधित है। सामान्य रेल विचारधारा की परवाह किए बिना सभी डेटा अखंडता मुद्दों के लिए डेटाबेस जिम्मेदार होना चाहिए।
- आपका सत्यापन तालिका स्कैन को ट्रिगर करता है और कोई भी तालिका स्कैन पसंद नहीं करता है।
आप उन दोनों समस्याओं को एक सूचकांक से हल कर सकते हैं। पहली समस्या डेटाबेस के अंदर एक अद्वितीय अनुक्रमणिका का उपयोग करके हल की जाती है। दूसरी समस्या lower(username)
. के परिणाम को अनुक्रमित करके हल की जाती है के बजाय username
।
AFAIK रेल अभी भी अभिव्यक्तियों पर अनुक्रमणिका को नहीं समझती है, इसलिए आपको दो काम करने होंगे:
-
schema.rb
. से स्विच करें करने के लिएstructure.sql
रेल को अपनी अनुक्रमणिका के बारे में भूलने से रोकने के लिए। आपकेconfig/application.rb
. में आप सेट करना चाहेंगे:config.active_record.schema_format = :sql
आपको
db:structure:*
. का उपयोग भी शुरू करना होगाdb:schema:*
. के बजाय रेक कार्य कार्य। एक बार जब आपstructure.sql
पर स्विच कर लेते हैं , आप हटा सकते हैंdb/schema.rb
चूंकि इसे अब अपडेट या उपयोग नहीं किया जाएगा; आपdb/structure.sql
tracking पर नज़र रखना भी शुरू करना चाहेंगे संशोधन नियंत्रण में। -
माइग्रेशन में थोड़ा सा SQL लिखकर इंडेक्स को हाथ से बनाएं। यह आसान है:
def up connection.execute(%q{ create index idx_users_lower_username on users(lower(username)) }) end def down connection.execute(%q{ drop index idx_users_lower_username }) end
बेशक यह आपको PostgreSQL-विशिष्ट चीजों के साथ छोड़ देगा लेकिन इसमें चिंता की कोई बात नहीं है क्योंकि ActiveRecord आपको वैसे भी कोई उपयोगी पोर्टेबिलिटी नहीं देता है।