2015-02-07 3 views
12

मान लें कि मैं Image.column_names करता हूं और यह पोस्टमोड जैसे सभी कॉलम दिखाता है लेकिन मैं कैसे जांचूं कि post_id पर एक अनुक्रमणिका है या नहीं?रेल कंसोल के माध्यम से कॉलम पर कोई अनुक्रमणिका होने पर जांच कैसे करें?

उत्तर

17

ActiveRecord "कनेक्शन एडेप्टर" कक्षाओं में से एक पर index_exists? विधि है।

आप इस तरह इसका इस्तेमाल कर सकते हैं:

Image.connection.index_exists? :images, :post_id 
+5

'id' विशेषता के मामले में यह हमेशा 'झूठी' देता है। क्या मैं कुछ गलत कर रहा हूं 'रेफरल.कनेक्शन.इंडेक्स_एक्सिस्ट्स? : रेफ़रल, आईडी आईडी? – kamal

+0

@kamal 'index_exists? 'जांचता है कि कॉलम पर कोई अनुक्रमणिका मौजूद है। यह नहीं पता कि यह कैसे चेक किया गया है, लेकिन मेरे लिए यह कभी-कभी झूठी वापसी भी करता है। इंडेक्स द्वारा नाम की जांच करने के लिए [index_name_exists?] (Http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-index_name_exists-3F) है, यह कस्टम इंडेक्स – ololobus

+0

@ ololobus लेकिन इस विधि 'index_name_exist?' को इंडेक्स नाम से जानना आवश्यक है, जो जानना मुश्किल है क्योंकि आप यह भी नहीं जानते कि इंडेक्स है या नहीं या जिसके लिए आप वास्तव में खोज रहे हैं। – kamal

1

मेरे लिए काम किया है:

ActiveRecord::Base.connection.index_exists?(:table_name, :column_name) 
4

दूसरों के रूप में उल्लेख किया है, आप अगर स्तंभ पर एक सूचकांक मौजूद है की जाँच करने के लिए निम्न का उपयोग कर सकते :

ActiveRecord::Base.connection.index_exists?(:table_name, :column_name) 

हालांकि यह ध्यान देने योग्य है कि यह सूचकांक मौजूद है अगर यह सूचकांक मौजूद है वह कॉलम और केवल वह कॉलम। यदि आप कंपाउंड इंडेक्स का उपयोग कर रहे हैं तो यह आपके कॉलम को शामिल नहीं करेगा। आप

ActiveRecord::Base.connection.indexes(:table_name) 

के साथ एक मेज के लिए अनुक्रमित के सभी देख सकते आप index_exists? के लिए स्रोत कोड को देखें, तो आपको लगता है कि आंतरिक रूप से यह indexes उपयोग कर रहा है या नहीं अपनी अनुक्रमणिका मौजूद लगाने की देखेंगे। तो अगर, मेरे जैसे, उनका तर्क आपके उपयोग के मामले में फिट नहीं है, तो आप इन इंडेक्स के माध्यम से लूप कर सकते हैं और देख सकते हैं कि उनमें से कोई काम करेगा या नहीं। मेरे मामले में, तर्क इस प्रकार था:

ActiveRecord::Base.connection.indexes(:table_name).select { |i| i.columns.first == column_name.to_s}.any? 

यह भी ध्यान देना महत्वपूर्ण है, indexes सूचकांक कि स्वचालित रूप से रेल आईडी के लिए उत्पन्न करता है, बताते हैं यही वजह है कि कुछ लोगों को ऊपर index_exists?(:table_name, :id)

के लिए कॉल के साथ समस्याओं कर रहे थे वापस नहीं करता है
संबंधित मुद्दे