2012-06-27 12 views
5

मैं रूबी 3.2.2 पर रूबी का उपयोग कर रहा हूं और मैं जानना चाहता हूं कि दायरे के तरीकों में "गतिशील रूप से" तालिका में शामिल होना संभव है यदि वह तालिका अभी तक शामिल नहीं है। यह यही है, मेरे पास है:क्या यह तालिका केवल "तालिका में" जुड़ना संभव है यदि वह तालिका अभी तक शामिल नहीं है?

# Note: the following code is just a sample in order to understand what I mean. 
def self.scope_method_name(user) 
    if table_is_joined?(joining_table_name) 
    where("joining_table_name.user_id = ?", user.id) 
    else 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
    end 
end 

क्या यह संभव है/कि करने की सलाह दी:

def self.scope_method_name(user) 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
end 

मैं निम्नलिखित की तरह कुछ बनाने के लिए चाहते हैं? यदि हां, तो मैं कैसे आगे बढ़ सकता/सकती हूं?


मैं क्रम में इस दृष्टिकोण का उपयोग करने के लिए multiple database table statements in INNER JOIN of SQL queries (कुछ मामलों में यह काम नहीं कर के रूप में कई टेबल बयान के बाद से उम्मीद की क्वेरी मेरी एसक्यूएल बनाने के लिए लगता है में) से बचने के लिए और इतने देखभाल के बिना scope_method_name उपयोग करना चाहते हैं संबंधित एसक्यूएल क्वेरी चिंताओं (मेरे मामले में, डेटाबेस टेबल में शामिल होने की देखभाल किए बिना)।

नोट: यह एसक्यूएल त्रुटियों बढ़ा सकता है (उदाहरण के लिए, त्रुटियों के रूप में की तरह "ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'joining_table_name.user_id' in 'where clause'") जब आप है अब तक शामिल नहीं डेटाबेस तालिका (उदाहरण के लिए, इस जब आप ClassName.scope_method_name(@user)की तरह कोड को चलाने के भी हो सकता है पहलेjoining_association_name में शामिल होने के बिना और इसलिए संबंधित joining_table_name तालिका में शामिल होने के बिना)।

उत्तर

-1

यह जांचने के लिए कि कोई संगठन लोड हो गया है, loaded? विधि कहां है। आप इसका उपयोग करने की कोशिश कर सकते हैं।

if association_name.loaded? 
    where("joining_table_name.user_id = ?", user.id) 
else 
    joins(:joining_association_name).where("joining_table_name.user_id = ?", user.id) 
end 
+0

विल अपने कोड से बचने एसक्यूएल त्रुटियों (उदाहरण के लिए, त्रुटियों के रूप में की तरह "आप अपने SQL विवरण में कोई त्रुटि है: तालिका' joining_table_name' SQL क्वेरी में निर्दिष्ट नहीं है या कि तालिका में मौजूद नहीं है डेटाबेस ") जब आपके पास * अभी तक शामिल नहीं है * डेटाबेस तालिका (उदाहरण के लिए, यह तब हो सकता है जब आप' ClassName.scope_method_name (@user) '* जैसे कोड चलाते हैं * पहले से * शामिल होने के बिना 'joining_association_name' में शामिल हों और इसलिए बिना शामिल किए संबंधित 'joining_table_name' तालिका)? – user12882

+0

क्षमा करें, मैंने अभी देखा है कि आप एक दायरे का उपयोग करने की कोशिश कर रहे हैं। 'association_name.loaded? 'केवल एक उदाहरण के लिए उपलब्ध होगा। आपके प्रश्न का उत्तर नहीं दे सकता ... लेकिन रेलों को दो बार एसोसिएशन लोड नहीं करने का ख्याल रखना चाहिए। – spas

+0

ऐसा लगता है कि कम से कम [लिंक किए गए प्रश्न] के मामले में रेलों को "दो बार एसोसिएशन लोड नहीं करने" की परवाह नहीं है (http://stackoverflow.com/questions/11210241/what-means-happens- जब -उसे-इन-इन-इन-इन-बहु-डेटाबेस-टेबल-सेंट? lq = 1) (टिप्पणियां पढ़ें)। – user12882

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