2014-05-07 8 views
11

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

मैं कुछ वृक्ष संरचना और बच्चे मैं एक "मौजूद है" उप क्वेरी के साथ फिल्टर करने के लिए है कि जहां खंड है:

current_node.children.as("children_nodes").where(Node.where(...).exists) 

Node.where.clause पहले से ही children_nodes को मिलती है और यह काम करता है अगर मैं दो अलग-अलग मॉडल का प्रयोग करें। लेकिन मैं उपनाम का उपयोग कैसे करूं?

NoMethodError (undefined method `where' for #<Arel::Nodes::TableAlias 

यह बहुत बुनियादी है, लेकिन कुछ मैं याद कर रहा हूँ (मैं भी अरेल के लिए नया हूँ): में से ऊपर कोड परिणाम देगा।

+0

'current_node.children.as साथ प्रयास करें (" children_nodes ") नोड (। जहां (...) मौजूद है)' हालांकि परीक्षण किया नहीं था। – Pavan

+0

current_node.children.as ("children_nodes")। नोड मुझे # Micha

उत्तर

0

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

arel_obj = current_node.children.as ("children_nodes") संघ (Node.where (....)

sql_string = arel_obj.to_sql

Node.find_by_s: उदाहरण के लिए QL (sql_string)

यहाँ

कुछ लिंक है कि http://www.rubydoc.info/github/rails/arel/Arel/SelectManager

0

अरेल में, as मदद कर सकता है कि बात करने के लिए सब कुछ लेगी और उसका उपयोग किसी नामित सबक्वेरी है कि आप एक FROM खंड में डाल सकते हैं बनाने के लिए होगा । उदाहरण के लिए, current_node.children.as("children_nodes").to_sql कुछ इस तरह प्रिंट होगा:

(SELECT nodes.* FROM nodes WHERE nodes.parent_id = 5) AS children_nodes 

लेकिन यह क्या आप वास्तव में चाहते हैं nodes मेज पर एक एसक्यूएल उर्फ ​​दे रहा है जैसा लगता है। तकनीकी तौर पर आप ऐसा कर सकते from साथ:

current_node.children.from("nodes AS children_nodes").to_sql 

लेकिन अगर आप ऐसा करते हैं, अन्य बातों के बहुत सारे, तोड़ने क्योंकि क्वेरी का शेष अभी भी SELECT nodes.* करने की कोशिश कर रहा है और फ़िल्टर कर WHERE nodes.parent_id = 5 जा रहे हैं।

तो मुझे लगता है एक बेहतर विकल्प एक उपनाम का उपयोग कर से बचने के लिए, या find_by_sql से अपनी क्वेरी लिखने के लिए है:

current_node.children.where(
    Node.from("nodes n").where("...").select("1").exists 
) 
:

Node.find_by_sql <<-EOQ 
    SELECT n.* 
    FROM nodes n 
    WHERE n.parent_id = 5 
    AND EXISTS (SELECT 1 
       FROM nodes n2 
       WHERE ....) 
EOQ 

शायद आप भी चीजों के बजाय आंतरिक तालिका अलियासिंग से काम कर सकता है

0

आप विशेषता table_alias का उपयोग करने में सक्षम हो सकते हैं जिसे आप एक एरियल :: तालिका पर कॉल कर सकते हैं।

उदाहरण:।।

# works 
users = User.arel_table 
some_other_table = Post.arel_table 
users.table_alias = 'people' 
users.join(some_other_table) 

# doesn't work 
users = User.arel_table.alias('people') 
some_other_table = Post.arel_table 
users.join(some_other_table) 
संबंधित मुद्दे