2013-10-28 8 views
6

मैं इसे सही तरीके से कैसे लिखूं?रेल 4 सिंटेक्स - एकाधिक शर्तें

Request.pending.where(.....) ## Request.pending = request.state_id in (1..3) 

जहां इन शर्तें हैं:

approver1_id = current_user and state_id = 1 
or 
approver2_id = current_user and state_id = 2 
or 
approver3_id = current_user and state_id = 3 

यह वास्तव में अच्छा होगा यदि मैं इन शर्तों के मॉडल में अन्य नियंत्रकों/दृश्यों में इस्तेमाल के लिए, भी डाल सकता है हो सकता है, क्योंकि मैं इन शर्तों का उपयोग करेगा अक्सर पूरे ऐप में।

+0

शायद 'Request.pending.where (tryver1_id: current_user, state_id: 1) '। या आप उस समय सभी 3 की जरूरत है? – zishe

+0

क्षमा करें, मैं या बीच में ... –

उत्तर

11

प्रयास करें:

Request.pending.where(
    '(approver1_id= ? AND state_id= ?) OR 
    (approver2_id= ? AND state_id= ?) OR 
    (approver3_id= ? AND state_id= ?)', 
    current_user.id, 
    1, 
    current_user.id, 
    2, 
    current_user.id, 
    3 
) 

संपादित करें: मैं भूल गया था कि आप कोलन का उपयोग करना चाहिए। और यह 'current_user.id' नहीं होना चाहिए? यह भी अस्पष्ट है कि आपका अनुरोध तीन मानकों का उपयोग करने वाले 1_id - tryver3_id या प्रति अनुरोध केवल एक दृष्टिकोण_आईडी का उपयोग करता है।

संपादित करें 2: एसक्यूएल में परिवर्तित क्वेरी।

+0

एचएम, उपर्युक्त दोनों उत्तर current_user स्थिति को अनदेखा करते हैं - यह राज्य_आईड्स 1-3 से मिलने के अनुरोध दिखाता है, लेकिन दृष्टिकोण 1-3 को अनदेखा करता है। मैंने इसे current_user और current_user.id के साथ करने की कोशिश की। –

+0

एक अनुरोध में तीन राज्यों के लिए तीन दृष्टिकोण हैं। मैं केवल दायरे के साथ लंबित अनुरोध खींच रहा हूं: 'request.pending = 1-3 का state_id, जो है: (लंबित स्वीकृति 1, लंबित स्वीकृति 2, लंबित स्वीकृति 3)। यदि अनुरोध लंबित स्वीकृति 1 है और मैं अनुमानक हूं 1, रिकॉर्ड को मेरी सूची में दिखाना आवश्यक है - अगर मैं अनुमानित हूं 2 और अनुरोध लंबित स्वीकृति 2 ... आदि है, लेकिन, यदि मैं अनुमानित हूं 1 और अनुरोध लंबित स्वीकृति 2 है, तो मैं नहीं चाहता मेरी सूची में रिकॉर्ड देखने के लिए। –

+0

@KatieM वर्तमान उपयोगकर्ता एक समय में केवल एक ही हो सकता है? यही कारण है कि मैं केवल current_user.id की जांच कर रहा हूं। शायद आप अपनी डीबी स्कीमा को बेहतर बनाने की कोशिश करें। अन्यथा अपने प्रश्न को और अधिक विशिष्ट बनाओ। –

1

खैर

पहले सभी state_id & सरणी में यह दुकान मिलता है। और उसके बाद उस सरणी को खंड में पास करें। यह MySQL क्वेरी के समान है।

state_id = [1, 2, 3] 
Request.pending.where(:state_id => state_id AND :approved_id => current_user.id) 

मुझे आशा है कि यह आप इच्छित परिणाम लायेगा:

इसलिए आपकी क्वेरी की तरह कुछ हो जाएगा।

+1

रेल 4 स्वीकार करता है 'Request.pending.where (' state_id IN [1,2,3] ') '? – Edmund

+0

Request.pending पहले से ही मॉडल में परिभाषित किया गया है। मुझे password_id संख्या से मेल खाने के लिए state_id संख्या की आवश्यकता है। –

7

इस क्वेरी पुन: उपयोग के बारे में अपने प्रश्न के दूसरे भाग का जवाब करने के लिए आपको सिर्फ इतना है कि एक उपयोगकर्ता पैरामीटर स्वीकार करता है Request पर एक वर्ग विधि को परिभाषित कर सकते हैं:

# usage: Request.pending_approval(current_user) 
def self.pending_approval(user) 
    pending.where("(approver1_id = :user AND state_id = 1) OR 
       (approver2_id = :user AND state_id = 2) OR 
       (approver3_id = :user AND state_id = 3)", 
       user: user) 
end 

आप अलग-अलग टुकड़ों का पुन: उपयोग करने में सक्षम होना चाहते हैं क्वेरी के रूप में और उन्हें आवश्यकतानुसार संयोजित करें, this related answer देखें (ध्यान दें, स्वीकृत उत्तर स्वीकृत एक, आईएमओ से बेहतर है)।

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